Ich schreibe eine lokale Musik-Streaming-App mit Node und NodeWebkit. In meiner App scanne ich den Musikordner nach Verzeichnissen, lade das Albumcover und zeige dann die Grafik in HTML an. Die Logik zum Erkennen des Endes von .forEach()
Iteratoren am Ende jedes asynchronen Rückrufs macht jedoch aus Sicht des Entwicklers keinen sauberen Code. Logischerweise funktioniert es, aber wenn ich diese Reihe von Abhängigkeiten entwirren würde, müsste ich alles neu schreiben.Optimale Möglichkeit zum Stapeln von asynchronen Callback-Ereignissen in Nodejs
Hier ist ein Ausschnitt aus meinem Code:
// Fetch the music albums
fs.readdir("./music", function(err, files) {
if (err) {
//return console.error(err);
}
//document.write(JSON.stringify(files));
// Look specifically for music album folders (directories)
filterDirectories("./music", files, function(dirs){
dirs.forEach(function(dir, index, array){
fs.readFile('./music/' + dir + "/album.json", 'utf-8', function (err, data) {
data = JSON.parse(data);
if (err) {
return console.error(err);
}
// Create a li item for every album, and append it to the unordered list
var li = $('<li><img /><a target="_blank"></a></li>');
li.find('a')
.attr('href', '#')
.text(data.album_name);
li.find('img').attr('src', './music/' + dir + '/' + data.album_art_loc).css('width:512px;height:512px;');
lis.push(li);
// Is this the last album folder?
if(index == array.length-1) {
// Go through the array
lis.forEach(function(item, index, array){
// add to the ul element
item.appendTo(ul);
// Have we added the last one to the ul element?
if(index == array.length - 1){
// Ok, now we initialize the flipster plugin to make it look 3D and advanced
$('.flipster').flipster({
style: 'carousel'
});
}
});
}
});
});
});
});
Wo wird 'lis' initialisiert? Wie soll 'if (index == array.length-1) {' funktionieren? – Bergi
Ich empfehle, sich Versprechungen anzusehen. – Bergi
Sie mischen auch Browsercode mit Node.js-Code. – djfdev