节点JS范围,尝试执行GET请求并将响应写入数组,但似乎数组在函数中不可见。
var stats = [];
for(var i = 0; i<tempBackends.length; i++)
{
http.get(tempBackends[i], function(res) {
console.log("Received response: " + res.statusCode);
if(res.statusCode == 200) {
stats.push('OK');
console.log('pushed OK\n');
}
else {
stats.push('Not OK');
console.log('pushed Not OK\n');
}
});
}
答案 0 :(得分:0)
循环异步调用不会很好,因为你不知道什么时候完成并且填充了rest-api-framework
数组。你需要一些额外的机器来处理这个问题。不使用SOA
或承诺,基本思路是:
stats
但是,使用此方法,async
数组将不会与var stats = [];
var finishedCount = 0; // keep track of how many callbacks have completed
for (let i = 0; i<tempBackends.length; i++)
{
http.get(tempBackends[i], function(res) {
console.log("Received response: " + res.statusCode);
if(res.statusCode == 200) {
stats.push('OK');
console.log('pushed OK\n');
}
else {
stats.push('Not OK');
console.log('pushed Not OK\n');
}
// ADD LOGIC HERE TO HANDLE ALL CALLBACKS HAVING FINISHED
finishedCount++;
if (finishedCount === tempBackends.length) {
console.log("ALL DONE!! stats is", stats);
}
});
}
对齐。 stats
中值的顺序将基于异步调用的完成顺序。此外,这种代码风格很难维护。相反,您应该使用tempBackends
或承诺。 stats
方法是:
async
承诺方法更具可读性和可写性。首先,制作async
的宣传版:
async.map(
tempBackends,
function(backend, callback) {
http.get(backend, function(res) {
callback(null, res.statusCode === 200 ? "OK" : "Not OK");
});
function(err, data) {
console.log("ALL DONE!! stats is", data);
}
);
现在你可以写
http.get
答案 1 :(得分:0)
var http = require('http');
var list = ['http://rest-service.guides.spring.io/greeting',
'http://rest-service.guides.spring.io/greeting',
'http://rest-service.guides.spring.io/greeting',
'http://rest-service.guides.spring.io/greeting',
'http://rest-service.guides.spring.io/greeting'];
var responseArray = [];
var calls = function(){
var index = 0;
var callWithIndex = function (i){
http.get(list[i], function(apiResponse) {
var statusCode = apiResponse.statusCode;
apiResponse.on('data', function(chunk) {
});
apiResponse.on('end', function() {
responseArray.push(statusCode);
i += 1;
if(i < list.length){
callWithIndex(i);
} else {
console.log(responseArray.toString());
}
});
});
};
callWithIndex(index);
};
calls();
如果你搞乱了nodejs,你应该知道应该在下一次迭代时执行哪个回调以及何时应该处理数据。注意我是如何在response.on('end')部分中调用下一个迭代的,以及我如何将statusCode推送到那里的数组。
答案 2 :(得分:-2)
尝试在函数内部传递数组变量stats
,因为函数的范围是本地的。
http.get(tempBackends[i], function(res,stats) {
// access stats here now
}