需要帮助的思考如何编程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函数有两个参数err
和result
的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)
如果你想推出自己的
- 计数文件,把它放在一个变种
- 每次fs打开一个文件并调用你的中间callback函数,计算并存储MD5
- 另外,减less计数器。
- 当计数器=== 0时,调用“最终”callback,传回所有的MD5。
为了回答你的问题(理论上),在Javascript世界中,(目前)有两种不同的方式来处理asynchronous代码
-
使用callback。 这是人们开始使用Javascript知道的最基本的方式。 不过,还有很多图书馆可以帮助人们以不太痛苦的方式处理callback,如
async
,step
。 在你的特定问题。 假设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的数据。
我希望这有帮助。