2016-03-22 11 views
0

Ich bin neu bei Knoten und ich versuche, die Twitter-ID einer Gruppe von Benutzern zu holen. Das Modul akzeptiert ein Array von Bildschirmnamen und iteriert darüber, um die userId abzurufen und an ein Array zu senden. Das Problem ist, ich kann dieses Array nicht zurückgeben. Ich kann im Rahmen der Funktion darauf zugreifen, aber ich kann nicht darauf zugreifen. Ich lese die Antworten auf ähnliche Fragen here und here über variable Shadowing und versuchte es, aber es funktioniert nicht.NodeJs - kann nicht auf den aktualisierten Wert des Arrays außerhalb des Funktionsumfangs zugreifen

Ich bin mir ziemlich sicher, dass ich einen dummen Fehler mache. Kannst du dir bitte den Code ansehen und mir hier helfen?


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

Antwort

1

Ihr Problem ist nicht mit oder Shadowing Scoping.

Das Problem ist, dass Sie nicht auf die Antwort der Twitter API warten. Sie legen die IDs nur innerhalb eines Callbacks fest, geben aber sofort das Array zurück, das zurückgegeben wird, bevor einer der Callbacks beendet wird.

Der richtige Weg wäre, eine Reihe von Versprechen mit einigen Versprechen Bibliothek wie Bluebird bevölkern und darauf warten. Als grober Hack können Sie versuchen, ein Timeout hinzuzufügen, aber dann riskieren Sie unvollständige Ergebnisse.

+0

Ich wusste, dass ich einen dummen Fehler machte. –