2014-06-24 36 views
1

我使用Node.JS遍历一些数据并将该数据推送到一个数组。但是,console.log似乎没有显示我所做的任何更改。我希望在函数完成数据推送后能够在twitter_ids中处理数据。For循环遍历NodeJS中的数组,但console.log不会打印到终端?

我想知道是否是由于误解了Node.JS的异步性质?

var twitter_ids = [] 

function sendResults (twitter_ids){ 
    return function(data){ 
     for (var num in data['results']) { 
      T.get('users/lookup', { screen_name: data['results'][num]['twitter_id'] }, function(err, data, response) { 
       twitter_ids.push(data[0]['id']); 
      }); 
     } 
    console.log(twitter_ids); 
    } 
} 

sunlightResults.call(sendResults(twitter_ids)); 
+1

功能是异步的实现。在操作完成之前,数组实际上不会被填充。 – Pointy

回答

2

您的问题是,在T.get()检索到任何数据之前,您正在打印到控制台。

如果您需要等待多个回调被调用(按照您的示例),我通常使用助手库函数,如async.eachSeries()。如果你想自己做,像递归可以是你的朋友,但可能是一个有点令人费解:

function lookup(list, index, output, finished) { 
    if(index >= list.length) { return finished(output); } 

    var num = list[index]; 
    T.get('users/lookup', { screen_name: data['results'][num]['twitter_id'] }, function(err, data, response) { 
     output.push(data[0]['id']); 
     lookup(list, index+1, output, callback);    
    }); 
} 

var outputList = []; 
lookup(data['results'], 0, outputList, function(output){ 
    console.log(output); 
}); 

我相信在这里的一些天才可以让这个更好的可读性更强,但只是一个超级简单的例子。

0

下面是使用async

var async = require('async'); 
var twitter_ids = [] 

function sendResults (twitter_ids){ 
    return function(data){ 
     async.each(data.results, function (result, done) { 
      T.get('users/lookup', { 
       screen_name: result.twitter_id 
      }, function(err, data, response) { 
       if (err) { 
        return done(err); 
       } 
       twitter_ids.push(data[0].id); 
       done(); 
      }); 
     }, function (err) { 
      if (err) { 
       throw err; 
      } 
      console.log(twitter_ids); 
     }); 
    } 
} 

sunlightResults.call(sendResults(twitter_ids));