簡體   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