我刚刚学习 Node.js,所以对于我的第一个应用程序,就像很多人一样,我正在创建一个音乐库,这样我就可以通过网络浏览器从家里的服务器收听我的音乐。
我做得很好...但我很难理解如何不制造意大利面噩梦。我正在使用 Promise 并使用异步库来帮助解决这个问题。但我目前的情况是,我试图了解如何知道它何时完成,以便它可以执行必要的回调函数。
基本上,要点是我使用了一个异步库来执行两次调用,一次调用数据库,一次调用文件夹,这样我就可以将数据库中的文件与硬盘驱动器上指示的文件进行比较。每个异步方法完成后,它都会返回到我正在使用的异步库提供的“完整”回调。
此时,我想比较两个列表并插入数据库中缺少但在硬盘驱动器上找到的音乐文件。然后我想将整个列表发送回客户端以在网格中显示。
我正在使用元音乐数据库来执行此操作。这是到目前为止我的代码(未经测试/不完全完整)
function(err, results) {
console.log("ASYNC COMPLETED");
if (err) $this.callback(err, null);
var db = linq.asEnumerable(results.dbList);
var files = linq.asEnumerable(results.foldersList);
var filesToInsert = db.Where(d => !files.Contains(d.LocFile));
var newMusicList = [];
for (var file in filesToInsert) {
if (file.indexOf('mp3') || file.indexOf('mp4')) {
var fileData = musicMetaData(fs.createReadStream(file), function (err, metadata) {
if (err) throw err;
newMusicList.push(new Music ({
locFile : file,
artist : fileData.artist,
album : fileData.album,
albumArtist : fileData.albumartist,
title : fileData.title,
track : fileData.track.no,
totalTracks : fileData.track.of,
genre : fileData.genre,
image : fileData.picture.data,
imageType : fileData.picture.format,
duration : fileData.duration,
createdDate : Date.now(),
classification : "unknown"
}));
console.log(metadata);
});
}
}
//insert into database here the array I created.
var insertMyFiles.
//query database for the entire list
var musicListDb;
//return to the callback so it can send the results back to the client browser.
return $this.callback(err, musicListDb);
}
问题是我如何设置才能知道文件循环何时完全完成?那么我可以将创建的数组并将新条目插入到数据库中吗?那么我可以调用另一个查询并获取可用音乐的更新列表?
我可以想到一种我认为非常困惑的做法。这将用 for i=to length 替换 for in 。然后在最后的音乐元数据回调中检查是否 i+1=length 如果是,则调用其中的回调。
这对我来说似乎不对,而且在我看来有点像意大利面条。
我在这里没有看到或理解什么解决方案?
最佳答案
考虑使用async ,有了它真的很容易摆脱所谓的“回调 hell ”等等。
关于javascript - Node.JS 异步回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40453219/