对于在NodeJS中迭代数组但是console.log不能打印到终端的循环?

时间:2014-06-24 00:17:42

标签: javascript arrays node.js asynchronous

我正在使用Node.JS迭代一些数据并将数据推送到数组。但是,console.log似乎没有显示我所做的任何更改。我希望能够在完成功能推送数据后,在twitter_ids中处理数据。

我想知道是不是因为误解了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));

2 个答案:

答案 0 :(得分: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);
});

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

答案 1 :(得分: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));