异步每个函数
Async each function
我试图理解异步 each(coll, iteratee, callback)
函数来为数组的每个项目并行执行一个函数。从异步文档我了解到回调只会执行一次(当迭代函数将为数组的每个项目执行时)。
并且在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 函数时)而不是对数组的每个项目.
调用不带参数的回调会添加到 .each
函数内部的计数器。这个计数器,当满的时候是实际调用你的回调的东西。没有它,它永远不知道什么时候完成。
What does calling callback() or callback(null)
do in case of no errors.
不带参数或使用 null
调用 callback
向 async.each
发出信号,表明 iteratee
函数已完成对该项目的执行(file
在这种情况下的例子)。当所有 iteratee
函数都调用了它们各自的 callback
,或者其中一个将错误传递给它的回调时,async.each
将调用传递给它的原始 callback
函数。
详细说明一下,async.js
旨在处理异步函数。异步函数的好处(或问题,取决于您如何看待它)是无法判断它何时完成执行。处理这个的方法是给异步函数传递另一个函数,一个callback
,当它完成时执行。异步函数可以通过 callback
函数将它遇到的任何错误或它检索到的任何数据传递给原始调用函数。例如,fs.readFile传递读取的文件数据,任何错误,通过callback
函数传递。
Can't we just remove those callback() or callback(null)
, when we actually mean to call the callback only once (when iteratee function is executed for all the elements of the array) rather than for each item of the array.
不,因为 async.js
必须假设 iteratee
函数是异步的,因此,它必须等待它的 callback
。传递给 async.each
的 callback
只被调用一次。
混淆可能是由变量名引起的。一个单独的 callback
函数只能被调用一次。传递给 async.each
的 callback
函数与传递给 iteratee
的 callback
不同。每次使用 coll
中的值调用 iteratee
时,它都会传递一个新的 callback
函数。 iteratee
的调用只应调用传递的 callback
一次(否则 async
将抛出错误)。这允许 async
跟踪对 iteratee
函数的调用是否调用了它的 callback
,并等待其余函数调用它们各自的 callback
。一旦调用了所有 callback
函数,async.each
就知道所有异步 iteratee
函数调用已完成执行,并且它可以调用传递给它的原始 callback
。
这是创建文档的难点之一。它们必须足够简洁,以便开发人员可以快速从中获取信息,还必须包含足够的细节,以便他们可以解释概念或功能。有时很难达到平衡。
我试图理解异步 each(coll, iteratee, callback)
函数来为数组的每个项目并行执行一个函数。从异步文档我了解到回调只会执行一次(当迭代函数将为数组的每个项目执行时)。
并且在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 函数时)而不是对数组的每个项目.
调用不带参数的回调会添加到 .each
函数内部的计数器。这个计数器,当满的时候是实际调用你的回调的东西。没有它,它永远不知道什么时候完成。
What does calling
callback() or callback(null)
do in case of no errors.
不带参数或使用 null
调用 callback
向 async.each
发出信号,表明 iteratee
函数已完成对该项目的执行(file
在这种情况下的例子)。当所有 iteratee
函数都调用了它们各自的 callback
,或者其中一个将错误传递给它的回调时,async.each
将调用传递给它的原始 callback
函数。
详细说明一下,async.js
旨在处理异步函数。异步函数的好处(或问题,取决于您如何看待它)是无法判断它何时完成执行。处理这个的方法是给异步函数传递另一个函数,一个callback
,当它完成时执行。异步函数可以通过 callback
函数将它遇到的任何错误或它检索到的任何数据传递给原始调用函数。例如,fs.readFile传递读取的文件数据,任何错误,通过callback
函数传递。
Can't we just remove those
callback() or callback(null)
, when we actually mean to call the callback only once (when iteratee function is executed for all the elements of the array) rather than for each item of the array.
不,因为 async.js
必须假设 iteratee
函数是异步的,因此,它必须等待它的 callback
。传递给 async.each
的 callback
只被调用一次。
混淆可能是由变量名引起的。一个单独的 callback
函数只能被调用一次。传递给 async.each
的 callback
函数与传递给 iteratee
的 callback
不同。每次使用 coll
中的值调用 iteratee
时,它都会传递一个新的 callback
函数。 iteratee
的调用只应调用传递的 callback
一次(否则 async
将抛出错误)。这允许 async
跟踪对 iteratee
函数的调用是否调用了它的 callback
,并等待其余函数调用它们各自的 callback
。一旦调用了所有 callback
函数,async.each
就知道所有异步 iteratee
函数调用已完成执行,并且它可以调用传递给它的原始 callback
。
这是创建文档的难点之一。它们必须足够简洁,以便开发人员可以快速从中获取信息,还必须包含足够的细节,以便他们可以解释概念或功能。有时很难达到平衡。