async.each和async.every之间的区别?

时间:2017-06-27 11:22:13

标签: javascript node.js express async.js

async.js 中的async.each与async.every之间的区别? 似乎两者都是相同的,只是async.every返回结果。 纠正我,我错了。

2 个答案:

答案 0 :(得分:2)

each(arr,iterator,[callback])

将函数迭代器并行应用于arr中的每个项目。使用列表中的项目调用迭代器,并在完成时调用它。如果迭代器将错误传递给它的回调,则会立即调用主回调(对于每个函数)并显示错误。

注意,由于此函数并行地将迭代器应用于每个项目,因此无法保证迭代器函数将按顺序完成。

参数

arr - 要迭代的数组。 iterator(item,callback) - 一个应用于arr中每个项目的函数。迭代器传递一个回调(err),一旦完成就必须调用它。如果没有发生错误,则应该在没有参数或显式null参数的情况下运行回调。数组索引不会传递给迭代器。如果需要索引,请使用forEachOf。 callback(err) - 可选当所有迭代器函数完成或发生错误时调用的回调函数。 实例

// assuming openFiles is an array of file names and saveFile is a function
// to save the modified contents of that file:

async.each(openFiles, saveFile, function(err){
    // if any of the saves produced an error, err would equal that error
});
// 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');
    }
});

every(arr,iterator,[callback])

别名:全部

如果arr中的每个元素都满足异步测试,则返回true。每个迭代器调用的回调只接受一个true或false的参数;它首先不接受错误参数!这与节点库使用fs.exists等真值测试的方式一致。

参数

arr - 要迭代的数组。 iterator(item,callback) - 一个真实测试,用于并行应用于数组中的每个项目。迭代器传递一个回调(truthValue),一旦完成,必须用boolean参数调用它。 callback(result) - 可选一个回调函数,只要任何迭代器返回false,或者所有迭代器函数完成后立即调用。结果将为true或false,具体取决于异步测试的值。 注意:回调不会将错误作为第一个参数。

实施例

async.every(['file1','file2','file3'], fs.exists, function(result){
    // if result is true then every file exists
});

答案 1 :(得分:2)

异步每个

.each(coll, iteratee, callback)

它更像每个方法的数组。在每个Iterable(coll)元素上,将执行函数iteratee。这将是平行的。所以从网站上举例说明

async.each(openFiles, saveFile, function(err){
  // if any of the saves produced an error, err would equal that error
});

这里假设openFiles是文件路径数组。因此,每个人都会调用saveFile。这个过程将是并行的。因此无法保证执行顺序。这里将openFilessaveFile数组进行一些操作。如果任何元素导致saveFile中的错误,该函数将调用带有错误的邮件回调并停止该过程。

每次异步

.every(coll, iteratee, callback)

这看起来像是同样的方法。因为它还在iteratee元素上执行coll方法。但关键是,它会返回truefalse。它更像是一个过滤器,但唯一不同的是,如果false中的任何元素在iteratee方法中失败,它将返回coll。不要在这里混淆错误。如果执行时发生某些不确定的行为,将导致错误。因此方法中的callback将返回callback(err, result)。结果将为真或假,具体取决于coll是否通过了iteratee测试。

例如检查数组是否有偶数;

async.every([4,2,8,16,19,20,44], function(number, callback) {
      if(number%2 == 0){
         callback(null, true);
      }else{
        callback(null, false);
      }
}, function(err, result) {
    // if result is true when all numbers are even else false
});

因此更像是在可迭代实体中测试值集。如果他们通过了给定的测试。另一个例子可能是检查给定的数字是否为素数。