Для цикла, выполняющего итерацию по массиву в NodeJS, но консоли.журнал не будет выводиться на терминал?

#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));