首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >思考如何异步编程需要帮助

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

Stack Overflow用户
提问于 2014-01-23 13:34:16
回答 4查看 71关注 0票数 1

我使用NodeJS遍历一个文件列表,并为每个文件生成一个MD5散列。以下是我通常如何同步完成此操作:

代码语言:javascript
复制
// 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散列,我将需要转移到另一个函数来处理这些信息。

为了让我异步地做这件事,代码会变得有多粗糙?要完成我想做的事情,最干净的方法是什么?有没有我应该知道的常见的不同方法?

EN

回答 4

Stack Overflow用户

发布于 2014-01-23 13:40:35

要多次调用一个异步函数,您应该创建一个函数并以递归方式调用它,如下所示。

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

代码语言:javascript
复制
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
        }
    });
}
票数 2
EN

Stack Overflow用户

发布于 2014-01-23 13:43:07

一个很好的方法是使用异步。(在npm上搜索)

如果你想创建你自己的

  1. 计算文件数量,将其放入var
  2. 每次fs打开文件并调用您的中间回调,计算并存储MD5
  3. ,同时递减该计数器。
  4. 当计数器===为0时,调用“MD5s”回调,传回所有代码。
票数 1
EN

Stack Overflow用户

发布于 2014-01-23 13:44:35

为了回答您的问题(理论上),在Javascript世界中,(目前)有两种不同的方法来处理异步代码

使用回调的

  • 。这是人们开始使用Javascript所知道的最基本的方式。然而,有很多库可以帮助人们以一种不那么痛苦的方式处理回调,比如asyncstep。在你的特殊问题上。假设md5以某种奇怪的方式异步,你可以使用https://github.com/caolan/async#parallel
  • 来实现它,另一种方式是使用promise,还有大量符合promise的库,如qwhen。基本上,有了promise,您就有了一种更好的方式来组织代码流(IMO)。有了上面的问题,你可以使用when.all来收集md5的结果。但是,您需要将md5转换为符合promise的函数
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21300174

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档