需要帮助的思考如何编程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函数是asynchronous的,实际上有一个callback函数,该函数在为文件生成MD5哈希值后运行。 因此,我所有的currentFile.md5variables都将被设置为undefined。

一旦我得到了所有文件的所有MD5哈希,我将需要移动到另一个函数来处理这些信息。

为了让我asynchronous执行这些代码,代码有多难? 什么是最干净的方式来完成我想要做的事情? 我应该注意到哪些常见的不同方法?

要多次调用一个asynchronous函数,你应该创build一个函数,像这样在recursion中调用它。

我假设你的md5函数有两个参数errresult的callback。

 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 } }); } 

一个好方法是使用asynchronous。 (在npm上search)

如果你想推出自己的

  1. 计数文件,把它放在一个变种
  2. 每次fs打开一个文件并调用你的中间callback函数,计算并存储MD5
  3. 另外,减less计数器。
  4. 当计数器=== 0时,调用“最终”callback,传回所有的MD5。

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

  • 使用callback。 这是人们开始使用Javascript知道的最基本的方式。 不过,还有很多图书馆可以帮助人们以不太痛苦的方式处理callback,如asyncstep 。 在你的特定问题。 假设md5是奇怪的asynchronous,你可以使用https://github.com/caolan/async#parallel来实现它

  • 另一种方法是使用promise ,也有许多符合诺言的库,比如q 。 基本上,承诺你有一个更好的方式来组织你的代码stream(IMO)。 有了上面的问题,你可以使用when.all来收集md5的结果。 但是,您需要将md5转换为符合承诺的function

为了避免“callback地狱”,你应该向你的Node工具集介绍承诺的世界。 我build议q https://npmjs.org/package/q

这里有一篇关于SO的文章,可以帮助你,让你了解如何使用q.js promise来处理多个asynchronous操作的语法。

你基本上可以运行所有的asynchronous函数,但是当所有的promise都被parsing了,那么.then .then()链接的方法会被触发,然后在那里传递的函数可以处理MD5的数据。

我希望这有帮助。