2015-05-08 26 views
1

我真的很努力讓數組按照特定順序迭代,並且每個應該在下一個可以開始之前完成。我試過使用async.series和async.each,但結果並不像我期望的那樣。node.js 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: 

我應該怎麼做,而不是得到預期的結果?

謝謝!

+0

你必須調用'callback'異步! – Bergi

回答

2

async.each並行發生,因此所有這些函數都會同時運行。您正在尋找async.eachSeries方法:https://www.npmjs.com/package/async#eachseries-arr-iterator-callback

相同的情況下,唯一的迭代是系列適用於每個項目的編曲。下一個迭代器只在當前的迭代器完成時調用。這意味着迭代器的功能將按順序完成。

2

將所有這些回調函數放在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); 
    } 
}); 
+0

這是做這件事的骯髒,骯髒的方式。 – bardzusny

+0

你怎麼看?你實際上只需要在每個「步驟」中交換兩行。 – idbehold

+0

我首先得到註釋「1,2,3 async.series」和「done」,然後它按順序獲取數組,處理問題a1a2a3,b1b2b3,c1,c2c3 我希望得到它的確切預期訂購。 – mottosson

相關問題