【发布时间】:2017-03-20 02:10:25
【问题描述】:
我只是在学习 node.js,所以对于我的第一个应用程序,像很多人一样,我正在创建一个音乐库,这样我就可以在家里的服务器上通过网络浏览器收听我的音乐。
我做得很好...但我很难理解如何不制造意大利面条的噩梦。我正在使用 Promise 并使用异步库来帮助解决这个问题。但是我有这个当前场景,我试图了解如何知道它何时完成,以便它可以执行必要的回调函数。
基本上,要点是我使用了一个异步库来执行两次调用,一次调用数据库,一次调用文件夹,这样我就可以将数据库中的文件与硬盘驱动器上指示的文件进行比较。每个异步方法完成后,它会返回到我正在使用的异步库提供的“完成”回调。
此时我想通过比较两个列表并插入一个音乐文件,这些文件从数据库中丢失但在硬盘驱动器上找到。然后我想将整个列表发送回客户端,以便在网格中显示。
我正在使用 metamusicdata 库来执行此操作。到目前为止,这是我的代码(未经测试/未完全完成)
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 长度替换 for in。然后在最后的音乐元数据回调中检查是否 i+1=length 如果是,则在其中调用回调。
这对我来说似乎不对,而且在我眼里是相当的胡言乱语。
我在这里没有看到或理解什么解决方案?
【问题讨论】:
-
那么为什么有人对我的问题投了反对票而没有评论如何改进它?想知道为什么?
标签: javascript node.js asynchronous