我有这个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
完成
更一般地说,我想知道浏览器是否总是在执行队列的底部推送回调时。
答案 0 :(得分:1)
您可以获得您描述的两个输出示例,具体取决于ajax请求完成所需的时间。
编辑:请注意,这可能会锁定您的浏览器一段时间,但它不应该崩溃,然后打印类似***** DONE! ***** 2828725
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;
答案 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))
}
}
}