我正在尝试理解异步each(coll, iteratee, callback)
函数,以便为数组的每个项并行执行函数。从异步文档我了解回调将只执行一次(当为数组的每个项执行iteratee函数时)。
如果iteratee函数出错,调用callback('some error message')
将立即调用回调函数并显示错误消息。
以下是每个函数的异步文档的示例
// assuming openFiles is an array of file names
async.each(openFiles, function(file, callback) {
// Perform operation on file here.
console.log('Processing file ' + file);
if( file.length > 32 ) {
console.log('This file name is too long');
callback('File name too long');
} else {
// Do work to process file here
console.log('File processed');
callback();
}
}, function(err) {
// if any of the file processing produced an error, err would equal that error
if( err ) {
// One of the iterations produced an error.
// All processing will now stop.
console.log('A file failed to process');
} else {
console.log('All files have been processed successfully');
}
});
我无法理解的是,在没有参数的情况下调用callback()会是什么,当我在iteratee函数中没有错误时调用callback()而没有参数时,我觉得很奇怪。如果没有错误,调用callback() or callback(null)
会做什么。
我们不能只删除那些callback() or callback(null)
,当我们实际意味着只调用一次回调(当对数组的所有元素执行iteratee函数时)而不是数组的每个项目。 / p>
答案 0 :(得分:3)
如果没有错误,调用
callback() or callback(null)
会做什么。
调用callback
没有参数或null
信号到async.each
iteratee
函数已完成对该项目的执行(file
例)。当所有iteratee
函数调用各自的callback
时,或其中一个函数将错误传递给它的回调时,async.each
将调用传递给它的原始callback
函数。
为了详细说明,async.js
旨在处理异步函数。异步函数的好处(或问题,取决于你如何看待它)是没有办法告诉它何时完成执行。处理此问题的方法是将异步函数传递给另一个函数callback
,以便在完成时执行。异步函数可以通过callback
函数将遇到的任何错误或它检索到的任何数据传递给原始调用函数。例如,fs.readFile传递读取文件数据,并通过callback
函数传递任何错误。
我们不能只删除那些
callback() or callback(null)
,当我们实际意味着只调用一次回调(当对数组的所有元素执行iteratee函数时)而不是数组的每个项目。 / p>
不,因为async.js
必须假设iteratee
函数是异步的,因此,它必须等待它callback
。传递给callback
的{{1}}仅被调用一次。
混淆可能是由变量名称引起的。单个async.each
函数仅用于调用一次。传递给callback
的{{1}}函数与传递给callback
的{{1}}不同。每次使用async.each
中的值调用callback
时,都会传递一个新的iteratee
函数。 iteratee
的调用只能调用传递的coll
一次(callback
否则会抛出错误)。这样,iteratee
可以跟踪对callback
功能的调用是否已调用其async
,并等待其余部分调用各自的async
。调用所有iteratee
函数后,callback
知道所有异步callback
函数调用已完成执行,并且它可以调用传递给它的原始callback
。
这是创建文档的难点之一。他们必须简明扼要,开发人员可以快速从他们那里获取信息,并且还包括足够的细节,他们可以解释这个概念或功能。有时候实现这是一个很难的平衡。
答案 1 :(得分:0)
调用不带参数的回调会添加到{{1}}函数内的计数器。这个计数器,当满时是实际调用你的回调的东西。没有它,它永远不会知道它何时完成。