异步每个函数

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 调用 callbackasync.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.eachcallback 只被调用一次。

混淆可能是由变量名引起的。一个单独的 callback 函数只能被调用一次。传递给 async.eachcallback 函数与传递给 iterateecallback 不同。每次使用 coll 中的值调用 iteratee 时,它都会传递一个新的 callback 函数。 iteratee 的调用只应调用传递的 callback 一次(否则 async 将抛出错误)。这允许 async 跟踪对 iteratee 函数的调用是否调用了它的 callback,并等待其余函数调用它们各自的 callback。一旦调用了所有 callback 函数,async.each 就知道所有异步 iteratee 函数调用已完成执行,并且它可以调用传递给它的原始 callback

这是创建文档的难点之一。它们必须足够简洁,以便开发人员可以快速从中获取信息,还必须包含足够的细节,以便他们可以解释概念或功能。有时很难达到平衡。