是否总是在循环后执行ajax回调?

时间:2015-01-08 15:55:45

标签: javascript ajax browser

我有这个Javascript / JQuery代码:

$.ajax({...}).done(function() {
    console.log('done');
});
for(var i = 0; i < 10; i++)
    console.log(i);

让我们说ajax请求在循环达到第5次迭代时完成,浏览器是否会暂停循环执行并运行回调还是等待循环完成?

为了更清楚,这样的输出可能吗?
0
1
2
3
4
DONE

6
7
8
9

或输出总是:
0
1
2
3
4

6
7
8
9
完成

更一般地说,我想知道浏览器是否总是在执行队列的底部推送回调时。

2 个答案:

答案 0 :(得分:1)

您可以获得您描述的两个输出示例,具体取决于ajax请求完成所需的时间。

编辑:请注意,这可能会锁定您的浏览器一段时间,但它不应该崩溃,然后打印类似***** DONE! ***** 2828725

的内容

&#13;
&#13;
var promise = new $.Deferred(),
    i = 1, j = 0, to = 5000000;

promise.done(function() {
    document.write("***** DONE! *****\n" + i);
    i = to;
});

setTimeout(function() {
    promise.resolve();
}, 1000);

for(i = 1; i < to; ++i) {
    console.log(++j);
    //alert(++j);
}
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
&#13;
&#13;
&#13;

答案 1 :(得分:0)

我做的测试似乎表明循环必须先完成

<强> fiddle

time = new Date()
new Request.JSONP({
    url: 'http://jsfiddle.net/echo/jsonp/',
    onSuccess: function (response) {

        console.log('done ' + (new Date()-time))
    }
}).send();

for (var i = 0; i <= 65535; i++) {
    for (var j = 0; j <= 10000; j++) {
            if (i===65535 && j == 10000) 
            {
        console.log('loop complete ' + (new Date()-time))
            }
    }
}