NodeJs - не может получить доступ к обновленному значению массива вне области действия функции

0

Я новичок в узле, и я пытаюсь получить идентификатор twitter группы пользователей. Модуль принимает массив имен экранов и итерации по нему, чтобы получить userId и подталкивает их к массиву. Проблема в том, что я не могу вернуть этот массив. Я могу получить доступ к нему в рамках функции, но я не могу получить доступ к ней за ее пределами. Я прочитал ответы на подобные вопросы здесь и здесь о переменном затенении и пробовал, но он не работает.

Я почти уверен, что делаю тупая ошибка. Можете ли вы посмотреть на код и помочь мне здесь?


// extractIDs.js

var Twitter = require('twitter');
var client = new Twitter({
    consumer_key: process.env.TWITTER_CONSUMER_KEY,
    consumer_secret: process.env.TWITTER_CONSUMER_SECRET,
    access_token_key: process.env.TWITTER_TOKEN_KEY,
    access_token_secret: process.env.TWITTER_TOKEN_SECRET
});


exports.getIDs = function (screenNames) {
    var ids = ['something'];
    for (var i = 0; i < screenNames.length; i++) {
        client.get('users/show', {
            screen_name: screenNames[i],
            include_entities: false
        }, function (error, tweets, response) {
            ids.push(tweets.id); 
            console.log(ids) // works fine
        });

    } 
    return ids; //'something' gets returned instead of the populated ids

}

// server.js

app.post('/sendlist', bodyParser.urlencoded({
        'extended': 'true'
    }), function (req, res) {
        res.json(extractIDs.getIDs(req.body.screen_name));
    }

);

// controllers.js

.controller('testCtrl', ['$scope', '$http', function ($scope, $http) {
        $scope.printIt = function () {
            console.log('stuff from controller');
            $http({
                method: 'POST',
                url: '/sendlist',
                data: {
                    "screen_name": ['aminspeaks', 'nodejs']
                }

            }).then(function successCallback(response) {
                    console.log('Got This response from server-- ' + response.data); // "Got This response from server-- something"
                },
                function errorCallback(response) {
                    console.log('Shit went down bro');
                });
        };
        console.log('testCtrl is working');
            }])

Теги:
express
shadowing

1 ответ

1
Лучший ответ

Ваша проблема не в определении области видимости или тени.

Проблема в том, что вы не ждете ответа на авию Twitter. Вы только устанавливаете идентификаторы в обратном вызове, но сразу возвращаете массив, который возвращается до завершения любого из обратных вызовов.

Правильный способ состоял бы в том, чтобы заполнить массив обещаний, используя некоторую библиотеку обещаний, такую как bluebird, и ждать этого. В качестве грубого хака вы можете попробовать добавить некоторый тайм-аут, но тогда вы рискуете получить неполные результаты.

  • 0
    Я знал, что совершил какую-то глупую ошибку.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню