另一个问题......我有两个功能:
function(data, callback){ //F1
var URL = 'url';
request(URL, function(err, response, body) {
if(response.statusCode == 200){
var json = JSON.parse(body);
var chid = [];
for(var i = 0; i < json['champions'].length;i++){
chid.push(json['champions'][i].id);
}
data.rotation = chid;
free = chid;
callback(null, data);
}
});
},
function(data, callback) { //f2
for (var r=0; r<10; r++){
var URL = 'url';
request(URL,function(err, response, body) {
if(response.statusCode == 200){
var json = JSON.parse(body);
x.push(json.name);
data.rot = x;
}
})
}
callback(null, data);
},
F1一切都好。如果我拨打console.log(free)
或console.log(data.rotation)
,我就会得到我想要的数组。
功能2有点问题。 for-loop之外的数据不可用。如果我在循环外拨打console.log(data.rot)
或console.log(x)
,则说它未定义,因此我无法通过把手获取它。我不知道它是关于回调(空,数据)位置还是关于for循环。我不能单独处理它。
如何访问for-loop之外的数据,以及如何修复此代码?
答案 0 :(得分:0)
您正在循环中发出asynchronous
个请求,并在循环外部访问 返回的值。 for-loop
是同步的,但requests
在其内部制作不是。
Promise.all
可以使用,
Promise.all(iterable)
方法返回一个承诺,该承诺在iterable
参数中的所有承诺都已解决时解析,或者拒绝第一个通过的拒绝承诺的原因。
function abc(data, callback) {
var arr = [];
for (var r = 0; r < 10; r++) {
var URL = 'url';
var req = request(URL, function(err, response, body) {
if (response.statusCode == 200) {
var json = JSON.parse(body);
x.push(json.name);
data.rot = x;
}
});
arr.push(req);
}
Promise.all(arr).then(function SuccessHandler(arrayOfResults) {
callback(null, arrayOfResults);
}, function ErrorHandler(reason) {
console.log(reason)
});
}
&#13;
答案 1 :(得分:0)
F2是异步的。所以要回调你需要等到请求返回:
function(data, callback) { //f2
for (var r=0, dataRx=0; r<10; r++){
var URL = 'url';
request(URL,function(err, response, body) {
if(response.statusCode == 200){
var json = JSON.parse(body);
x.push(json.name);
data.rot = x;
}
dataRx++;
if(dataRx === 10) callback(null, data);
})
}
},