我试图等到所有回叫都完成。但是,计数器没有减少。我该如何解决这个问题?
var counter = json.length;
for(i=0;i<json.length;i++){
FB.api("url",function(response){
doSomething(response);
counter = counter - 1;
});
}
while(counter>0){
alert(counter);
}
在上面的代码中,计数器值与json.length保持一致。
答案 0 :(得分:4)
这就是问题......你永远不会让FB.api运行,因为你的同步循环占用了所有资源
一种简单的方法如下
var counter = json.length;
for (i=0;i<json.length;i++){
FB.api("url",function(response){
doSomething(response);
counter = counter - 1;
if(counter == 0) {
allDone();
}
});
}
其中allDone是所有FB.api完成后运行的函数
现代方法可能会使用Promises - 也许就像这样
Promise.all(json.map(function(item) {
return new Promise(function(resolve, reject) {
FB.api("url",function(response){
doSomething(response);
resolve(response);
});
});
})).then(function(results) {
// all done at this point, results is an array of responses from above
});
或者,正如@Bergi指出的那样
Promise.all(json.map(item =>
new Promise(resolve =>
FB.api("url", resolve)
)
.then(doSomething)
))
.then(function(results) {
// all done at this point, results is an array of responses from above
});
(ES5版本)
Promise.all(json.map(function(item) {
return new Promise(function(resolve, reject) {
FB.api("url", resolve);
}).then(doSomething);
})).then(function(results) {
// all done at this point, results is an array of responses from above
});
然而,假设FB.api
中的回调只得到一个参数 - 即在出错的情况下该怎么办?
答案 1 :(得分:-3)
var counter = json.length;
for(i=0;i<json.length;i++){
FB.api("url",function(response){
doSomething(response);
counter = counter - 1;
while(counter>0){
Alert (counter)
}
});
}