#javascript #arrays #node.js #asynchronous
#javascript #массивы #node.js #асинхронный
Вопрос:
Я использую Node.JS для перебора некоторых данных и отправки этих данных в массив. Однако консоль.журнал, похоже, не показывает никаких изменений, которые я внес. Я хотел бы иметь возможность обрабатывать данные в twitter_ids после того, как функция завершит передачу данных в нее.
Мне интересно, связано ли это с неправильным пониманием узла.Асинхронный характер 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. Функция является асинхронной. Массив фактически не будет заполнен до завершения операций.
Ответ №1:
Ваша проблема в том, что вы печатаете на консоль до 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);
});
Я уверен, что какой-нибудь гений здесь может сделать это лучше, более читаемым, но просто супер быстрый пример.
Ответ №2:
Вот реализация с использованием 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));