2015-08-21 2 views
0

Я хочу сделать очень простой код, где у меня есть два вложенных цикла в javascript, которые распечатывают индекс, в котором они сейчас находятся. (это база для чего-то еще, что я хочу сделать). Внутренний цикл имеет таймер, поэтому он должен подождать 1 секунду перед печатью каждого номера.Вложенные циклы с использованием async.js

Я ожидал бы этот вывод:

outer count: 0 
inner count: 0 
inner count: 1 
inner count: 2 
inner count: 3 
inner count: 4 
in out 
outer count: 1 
inner count: 0 
inner count: 1 
inner count: 2 
inner count: 3 
inner count: 4 
in out 

и т.д., но это не происходит. Есть ли какая-то очевидная ошибка в моем коде? могут асинхронно, хотя функции даже вложены? пожалуйста помоги! :(

Это мой код до сих пор:.

var count = 1; 
     async.whilst(
     function() {return count < 5}, 
     function(callback){ 


      var icount = 0; 

      console.log("outer count:" + count); 

      async.whilst(
       function() { return icount < 5; }, 
       function (callback) { 
        console.log("inner count:" + icount); 
        icount++; 
        setTimeout(callback, 1000); 
       }, 
       function (err) { 
        // 5 seconds have passed 
        console.log("in out"); 
       } 
      ); 

      count++; 

      callback(); 

     }, 
     function(err){ 
      console.log("out out"); 
     } 
     ); 
+0

Вызов 'callback' в асинхронном обратном вызове? – Bergi

ответ

5
var count = 1; 
     async.whilst(
     function() {return count < 5}, 
     function(outer_callback){ 


      var icount = 0; 

      console.log("outer count:" + count); 

      async.whilst(
       function() { return icount < 5; }, 
       function (callback) { 
        console.log("inner count:" + icount); 
        icount++; 
        setTimeout(callback, 1000); 
       }, 
       function (err) { 
        // 5 seconds have passed 
        console.log("in out"); 
        outer_callback(); // <--- here 
       } 
      ); 

      count++; 


     }, 
     function(err){ 
      console.log("out out"); 
     } 
     ); 

async.whilst не блокирует, а это значит, что все 5 из них планируется запустить одновременно

Изменение я сделал это что теперь в коде итерация внешнего контура завершается только как внутренняя итерация цикла.

+0

Большое вам спасибо, это сработало отлично :) – cmperezg

+0

Я нашел ошибку в этом ответе, я поставил здесь исправление кода: –

0

Вложенные циклы с использованием async.js:

var i = 0; 
    async.whilst 
    (
     function() {return i < 3}, 

     function(next_i) 
     { 
      var j = 0; 
      async.whilst 
      (
       function() { return j < 3; }, 
       function (callback) 
       { 
        console.log(i +'/'+ j); 
        j++; 
        setTimeout(callback,0); 
       }, 
       function() 
       { 
        i++; 
        next_i(); 
       } 
      ); 
     } 
    ); 

console.log

0/0 
0/1 
0/2 
1/0 
1/1 
1/2 
2/0 
2/1 
2/2 
Смежные вопросы