【问题标题】:NodeJs - cant access updated value of array outside function scope [duplicate]NodeJs - 无法访问函数范围外数组的更新值[重复]
【发布时间】:2016-03-22 14:08:57
【问题描述】:

我是 node 新手,我正在尝试获取一组用户的 twitter id。该模块接受一个屏幕名称数组并对其进行迭代以获取 userId 并将它们推送到一个数组中。问题是,我无法返回该数组。我可以在函数范围内访问它,但我不能在它之外访问它。我阅读了herehere 关于变量阴影的类似问题的答案并尝试了它,但它不起作用。

我很确定我犯了一个愚蠢的错误。你能看一下代码并帮助我吗?


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

【问题讨论】:

    标签: angularjs node.js express shadowing


    【解决方案1】:

    您的问题不在于范围界定或阴影。

    问题是,您不需要等待 Twitter api 的响应。您只需在回调中设置 id,但会立即返回在任何回调完成之前返回的数组。

    正确的方法是使用诸如 bluebird 之类的 Promise 库填充一组 Promise 并等待。作为一种粗略的技巧,您可以尝试添加一些超时,但您可能会冒不完整的结果的风险。

    【讨论】:

    • 我知道我犯了一些愚蠢的错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-28
    • 1970-01-01
    • 2020-05-31
    • 1970-01-01
    • 2017-03-14
    • 1970-01-01
    相关资源
    最近更新 更多