For循环迭代数组在NodeJS中,但console.log won't打印到终端

For loop iterating over array in NodeJS but console.log won't print to terminal?

本文关键字:won 终端 打印 log console 数组 迭代 循环 NodeJS For      更新时间:2023-09-26

我使用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));

您的问题是在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);
});

我相信这里有一些天才可以使这篇文章更好更可读,但只是一个超级快速的例子。

下面是使用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));