2015-10-27 118 views
1

我想遍歷列表的JavaScript列表。Javascript:遍歷列表的列表異步

目標是將每個項目傳遞給一個函數並異步處理它 。但它不起作用:

var tree = function (data, callback) { 

    var data_position = 0; 

    var iterate = function() { 

     if (data_position<data.length) { 
      if (Array.isArray(data[data_position])) { 
       tree(data[data_position], callback); 
       // If I uncomment these it will show all items but not ordered 
       //data_position++; 
       //iterate(); 
      } else { 
       callback(data[data_position++], iterate); 
      } 
     } 
    } 

    iterate(); 
} 


tree([1, 2, [100, 200, 300], 3, 4, 5, 6, 7, 8, 9], function (item, iterate) { 
    setTimeout(function(){ 
     console.log('Item: ' + item); 
     iterate(); 
    }, 1000); 
}) 

代碼停在300而不是處理樹的其餘部分。

如果我取消註釋上述2行,我可以打印所有項目,但它們 不顯示有序。 我該如何解決這個問題?

+1

你錯過了data_position ++,如果是一個數組試試這個:**樹(數據[data_position ++],回調); ** –

+0

仍然沒有工作,休息在300和 – SrgHartman

回答

2

該解決方案使用可選的第二個回調,讓孩子迭代函數tree信號父tree一旦孩子完成繼續運行。

它按預期運行,每次葉子元素迭代之間延遲1秒。

var tree = function (data, callback, done) { 
 
    var data_position = 0; 
 
    var iterate = function() { 
 
     if (data_position<data.length) { 
 
      if (Array.isArray(data[data_position])) { 
 
       tree(data[data_position++], callback, function() { iterate(); }); 
 
      } else { 
 
       callback(data[data_position++], iterate); 
 
      } 
 
     } else if (done) { 
 
      done(); 
 
     } 
 
    } 
 
    iterate(); 
 
}; 
 

 

 
tree([1, 2, [100, 200, 300], 3, 4, 5, 6, 7, 8, 9], function (item, iterate) { 
 
    setTimeout(function(){ 
 
     console.log('Item: ' + item); 
 
     iterate(); 
 
    }, 1000); 
 
});

0

這應該工作:

var tree = function (data, callback) { 
 

 
    var data_position = 0; 
 

 
    var iterate = function() { 
 

 
     if (data_position<data.length) { 
 
      if (Array.isArray(data[data_position])) { 
 
       tree(data[data_position], callback); 
 
      } 
 
      callback(data[data_position++], iterate); 
 
     } 
 
    } 
 

 
    iterate(); 
 
} 
 

 

 
tree([1, 2, [100, 200, 300], 3, 4, 5, 6, 7, 8, 9], function (item, iterate) { 
 
    setTimeout(function(){ 
 
     if(!Array.isArray(item)) console.log('Item: ' + item); 
 
     iterate(); 
 
    }, 1000); 
 
})

+0

感謝。不幸的是,雖然它顯示所有的數字,它會同時顯示200和3以及300和4,而不是超時。 – SrgHartman

+0

當然,它同時顯示200&3和300&4,因爲數組是同時迭代的。 – misantronic