繁体   English   中英

带有async.each的node.js async.series与预期不符

[英]node.js async.series with async.each not doing as expected

我真的很难以一定顺序迭代数组,每个数组都应该在下一个数组开始之前完成。 我尝试使用async.series和async.each,但结果与我预期的不同。

我有以下代码:

var async = require('async');
var abc = ['a', 'b', 'c'];

// Step 1
function one(callback) {
  async.each(abc, function(issue, callback) {
    setTimeout(function(){
      issue += '1';
      console.log('Processing issue ' + issue);
    }, 2000);

    callback();
  }, function(err) {
    if(err) {
      console.log('Fail 1');
    } else {
      console.log('Success 1');
    }
  });
}

// Step 2
function two(callback) {
  async.each(abc, function(issue, callback) {
    setTimeout(function(){
      issue += '2';
      // Perform operation on file here.
      console.log('Processing issue ' + issue);
    }, 2000);

    callback();
  }, function(err) {
    if(err) {
      console.log('Fail 2');
    } else {
      console.log('Success 2');
    }
  });
}

// Step 3
function three(callback) {
  async.each(abc, function(issue, callback) {
    setTimeout(function(){
      issue += '3';
      // Perform operation on file here.
      console.log('Processing issue ' + issue);
    }, 2000);

    callback();
  }, function(err) {
    if(err) {
      console.log('Fail 3');
    } else {
      console.log('Success 3');
    }
  });
}

async.series([
  function(callback) {
    console.log('step 1 in async.series');
    one(callback);

    callback();
  },
  function(callback) {
    console.log('step 2 in async.series');
    two(callback);

    callback();
  },
  function(callback) {
    console.log('step 3 in async.series');
    three(callback);

    callback();
  }
], function(err) {
  if(err) return next(err);

  console.log('Done:');
});

结果:

step 1 in async.series
Success 1
step 2 in async.series
Success 2
step 3 in async.series
Success 3
Done:
//After two second timeout all below happens at once
Processing issue a1
Processing issue b1
Processing issue c1
Processing issue a2
Processing issue b2
Processing issue c2
Processing issue a3
Processing issue b3
Processing issue c3

预期:

step 1 in async.series
//Expected below after two second timeout
Processing issue a1
Processing issue a2
Processing issue a3
Success 1
step 2 in async.series
//Expected below after two+two second timeout
Processing issue b1
Processing issue b2
Processing issue b3
Success 2
step 3 in async.series
//Expected below after two+two+two second timeout
Processing issue c1
Processing issue c2
Processing issue c3
Success 3
Done:

我应该怎么做才能获得预期的结果?

谢谢!

async.each并行发生,因此所有这些功能都同时运行。 您正在寻找async.eachSeries方法: https : async.eachSeries

与每个迭代器相同,仅迭代器应用于arr中的每个项目。 仅在当前迭代器完成后才调用下一个迭代器。 这意味着迭代器功能将按顺序完成。

将所有这些callback()放入setTimeout()中。 然后一切都会按照您的预期工作。

编辑:每个步骤应类似于此:

// Step 1
function one(done) {
  console.log('step 1 in async.series');
  async.each(abc, function(issue, callback) {
    setTimeout(function(){
      issue += '1';
      console.log('Processing issue ' + issue);
      callback();
    }, 2000);
  }, done);
}

实际系列应如下所示:

async.series([one, two, three], function(err, data){
  if (err !== null) {
    console.log(data);
  } else {
    console.error(err);
  }
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM