我使用NodeJS遍历一个文件列表,并为每个文件生成一个MD5散列。以下是我通常如何同步完成此操作:
// Assume files is already populated with an array of file objects
for(file in files) {
var currentFile = files[file];
currentFile.md5 = md5(file.path);
}这里的问题是,MD5函数是异步的,并且实际上有一个回调函数,该函数在为文件生成MD5散列后运行。因此,我的所有currentFile.md5变量都将被设置为未定义。
一旦我得到了所有文件的所有MD5散列,我将需要转移到另一个函数来处理这些信息。
为了让我异步地做这件事,代码会变得有多粗糙?要完成我想做的事情,最干净的方法是什么?有没有我应该知道的常见的不同方法?
发布于 2014-01-23 13:40:35
要多次调用一个异步函数,您应该创建一个函数并以递归方式调用它,如下所示。
我假设您的md5函数有一个带有两个参数err和result的回调函数。
var keys = Object.keys(files); // taking all keys in an array.
function fn() {
var currentFile = files[keys.shift()];
md5(currentFile, function (err, result) {
// Use result, store somewhere
// check if more files
if (keys.length) {
fn();
} else {
// done
}
});
}发布于 2014-01-23 13:43:07
一个很好的方法是使用异步。(在npm上搜索)
如果你想创建你自己的
发布于 2014-01-23 13:44:35
为了回答您的问题(理论上),在Javascript世界中,(目前)有两种不同的方法来处理异步代码
使用回调的
async,step。在你的特殊问题上。假设md5以某种奇怪的方式异步,你可以使用https://github.com/caolan/async#parallel promise,还有大量符合promise的库,如q,when。基本上,有了promise,您就有了一种更好的方式来组织代码流(IMO)。有了上面的问题,你可以使用when.all来收集md5的结果。但是,您需要将md5转换为符合promise的函数https://stackoverflow.com/questions/21300174
复制相似问题