我正在使用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变量都将被设置为undefined。
一旦我获得了所有文件的所有MD5哈希值,我就需要转移到另一个函数来处理这些信息。
为了让我以异步方式执行此操作,代码会变得多么粗糙?什么是实现我想做的最干净的方法?我应该注意哪些常见的不同方法?
答案 0 :(得分:2)
要多次调用异步函数,你应该创建一个函数并像这样在递归中调用它。
我假设您的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
}
});
}
答案 1 :(得分:1)
一个很好的方法是使用异步。 (在npm搜索)
如果你想自己动手
答案 2 :(得分:1)
回答你的问题(理论上),在Javascript世界中,(目前)有2种不同的方式来处理异步代码
使用回调。这是人们开始使用Javascript知道的最基本的方式。但是,有很多库可以帮助人们以较少痛苦的方式处理回调,例如async
,step
。在你的特定问题。假设md5
在某种程度上异常异常,您可以使用https://github.com/caolan/async#parallel来实现它
另一种方法是使用promise
,还有许多符合承诺的库,例如q
,when
。基本上,有一个承诺,你有一个更好的方式来组织你的代码流(IMO)。针对上述问题,您可以使用when.all
收集md5
的结果。但是,您需要将md5
转换为符合承诺的函数
答案 3 :(得分:1)
为了避免“回调地狱”,你应该向你的Node工具集介绍promises的世界。我建议q https://npmjs.org/package/q
以下是有关SO的帖子,可以帮助您并了解语法how to use q.js promises to work with multiple asynchronous operations。
你基本上会使用deferred promises运行所有异步函数,当所有promise都被解析并且函数内部传递时,.then()
链式方法会触发,然后()可以处理你的MD5数据。
我希望这会有所帮助。