2015-10-27 76 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