需要帮助思考如何异步编程

时间:2014-01-23 05:34:16

标签: javascript node.js asynchronous

我正在使用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哈希值,我就需要转移到另一个函数来处理这些信息。

为了让我以异步方式执行此操作,代码会变得多么粗糙?什么是实现我想做的最干净的方法?我应该注意哪些常见的不同方法?

4 个答案:

答案 0 :(得分:2)

要多次调用异步函数,你应该创建一个函数并像这样在递归中调用它。

我假设您的md5函数有两个参数errresult的回调。

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搜索)

如果你想自己动手

  1. 计算文件,将其放入var
  2. 每次fs打开文件并调用中间回调,计算并存储MD5
  3. 此外,减少反击。
  4. 当计数器=== 0时,调用“最终”回调,传回所有MD5。

答案 2 :(得分:1)

回答你的问题(理论上),在Javascript世界中,(目前)有2种不同的方式来处理异步代码

  • 使用回调。这是人们开始使用Javascript知道的最基本的方式。但是,有很多库可以帮助人们以较少痛苦的方式处理回调,例如asyncstep。在你的特定问题。假设md5在某种程度上异常异常,您可以使用https://github.com/caolan/async#parallel来实现它

  • 另一种方法是使用promise,还有许多符合承诺的库,例如qwhen。基本上,有一个承诺,你有一个更好的方式来组织你的代码流(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数据。

我希望这会有所帮助。