2014-06-24 37 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));