为什么计数器变量没有递减?

时间:2017-03-15 01:04:01

标签: javascript jquery

我试图等到所有回叫都完成。但是,计数器没有减少。我该如何解决这个问题?

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保持一致。

2 个答案:

答案 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)
         }
    });
}