2016-03-22 83 views
0

我是新來的節點,我試圖獲取一組用戶的twitter id。該模塊接受一組屏幕名稱並遍歷它以獲取userId並將它們推送到一個數組。問題是,我無法返回該數組。我可以在函數的範圍內訪問它,但我無法在其外部訪問它。我閱讀了有關可變陰影的類似問題herehere的答案,並嘗試了它,但它不起作用。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 API的響應。您只在回調中設置標識,但立即返回在任何回調完成之前返回的數組。

正確的方法是使用一些承諾庫如藍鳥填充承諾數組並等待。作爲一個粗糙的黑客,你可以嘗試添加一些超時,但你可能會收到不完整的結果。

+0

我知道我犯了一些愚蠢的錯誤。 –