2016-03-22 3 views
0

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

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


// 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'); 
      }]) 

ответ

1

Ваша проблема не с обзорного или затенение.

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

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

+0

Я знал, что совершил какую-то туманную ошибку. –

 Смежные вопросы

  • Нет связанных вопросов^_^