所以,在Javascript中我只是做了一个简单的循环,它应该调用3次函数,但是它会在循环内执行3次,然后只调用函数3次。 任何关于为什么会这样的想法
function latest_update() {
for(var i = 1; i <= 3; i++) {
var id = parseInt(document.getElementById("event_id"+i).innerHTML);
alert("testing");
document.getElementById("row_num").innerHTML = "" + i;
FB.api("/" + id,
function (response) {
if (response && !response.error) {
var j = parseInt(document.getElementById("row_num").innerHTML);
alert(j);
document.getElementById("event_id"+j).innerHTML = response.name;
}
});
}
}
答案 0 :(得分:1)
由于Javascript的单线程事件循环,请参阅: http://blog.carbonfive.com/2013/10/27/the-javascript-event-loop-explained/
JS线程必须在为循环结束后排队的异步FB函数提供服务之前完成当前的执行上下文(在本例中为for循环)。
答案 1 :(得分:0)
您需要恢复代码。我用于HTTP请求的一个很好的设计模式是promise模式。使用promises,您可以实现代码来触发HTTP请求,等待所有结果进入,然后执行其他操作。像这样:
function doFBCall() {
var promise = new Promise();
FB.api('/' + id, function(response) {
// do something
...
// Now resolve the promise
promise.resolve();
// Note: you should handle the error cases with promise.reject();
});
return promise;
};
var arrayOfPromises = [];
arrayOfPromises.push(doFBCall());
arrayOfPromises.push(doFBCall());
arrayOfPromises.push(doFBCall());
// Wait for all promises to finish
Promise.all(arrayOfPromises).then(function() {
// All promises succeed
}).catch(function() {
// One or more promises failed
});
不确定您是否使用Angular或Ember等框架,其中可以随时使用promise库。