javascript - Node.JS 异步回调

标签 javascript node.js asynchronous

我刚刚学习 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/

相关文章:

javascript - 带有 fetch 的异步调用不等待完成并立即转到 then

javascript - 如何在异步操作期间使 Express.js 记录错误

javascript - 如何将数据表导出到 xls 在导出之前先询问密码

javascript - 将选中的项目推到列表顶部

node.js - Angular 4 的平均堆栈不起作用

node.js - 使用 nodejs 通行证集成第三方平台时出现 InternalOAuthError

javascript - 鼠标单击 Canvas 的一部分、鼠标悬停在 Canvas 上和鼠标移出 Canvas

javascript - 有人可以用对象解释奇怪的 JavaScript 吗?

node.js - 如何在nest js中实现guard的集成测试?

wcf - 如何使用 Moq 模拟 WCF 客户端?