我正在使用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));
答案 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));