异步每个功能

时间:2017-01-26 18:36:52

标签: javascript asynchronous async.js

我正在尝试理解异步each(coll, iteratee, callback)函数,以便为数组的每个项并行执行函数。从异步文档我了解回调将只执行一次(当为数组的每个项执行iteratee函数时)。

如果iteratee函数出错,调用callback('some error message')将立即调用回调函数并显示错误消息。

以下是每个函数的异步文档的示例

每个(coll,iteratee,callback)

// 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>

2 个答案:

答案 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}}函数内的计数器。这个计数器,当满时是实际调用你的回调的东西。没有它,它永远不会知道它何时完成。