NodeJs - 无法访问函数范围外数组的更新值
NodeJs - cant access updated value of array outside function scope
我是节点的新手,我正在尝试获取一组用户的推特 ID。该模块接受一组屏幕名称并对其进行迭代以获取 userId 并将它们推送到一个数组。问题是,我不能 return 那个数组。我可以在函数范围内访问它,但我不能在它之外访问它。我阅读了关于变量阴影的类似问题 here and here 的答案并尝试了但它不起作用。
我很确定我犯了一个愚蠢的错误。你能看看代码并帮助我吗?
// 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');
}])
您的问题不在于范围界定或阴影。
问题是,您不等待 Twitter api 的响应。您只需在回调中设置 ID,但在任何回调完成之前立即 return 数组 returned。
正确的方法是使用像 bluebird 这样的 promise 库填充一个 promise 数组,然后等待它。作为粗略的 hack,您可以尝试添加一些超时,但您可能会冒着结果不完整的风险。
我是节点的新手,我正在尝试获取一组用户的推特 ID。该模块接受一组屏幕名称并对其进行迭代以获取 userId 并将它们推送到一个数组。问题是,我不能 return 那个数组。我可以在函数范围内访问它,但我不能在它之外访问它。我阅读了关于变量阴影的类似问题 here and here 的答案并尝试了但它不起作用。
我很确定我犯了一个愚蠢的错误。你能看看代码并帮助我吗?
// 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');
}])
您的问题不在于范围界定或阴影。
问题是,您不等待 Twitter api 的响应。您只需在回调中设置 ID,但在任何回调完成之前立即 return 数组 returned。
正确的方法是使用像 bluebird 这样的 promise 库填充一个 promise 数组,然后等待它。作为粗略的 hack,您可以尝试添加一些超时,但您可能会冒着结果不完整的风险。