2015-05-08 2 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() s. Тогда все должно работать так, как вы ожидали.

Edit: Каждый шаг должен выглядеть примерно так:

// 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» и «сделано» первым, а затем он получает массив в порядке, Обработка вопроса a1a2a3, b1b2b3, c1, c2c3 Я хотел бы получить его в точном ожидаемом заказ. – mottosson

Смежные вопросы