我有以下代码,
function callPr() {
return new Promise(function(res, rej) {
setTimeout(function() {
res();
}, 0);
});
}
callPr().then(function() {
alert('Promise Done'); //this alert popsup before loop run
console.log('Promise Done'); //this console is printed after loop run
});
for (var i = 0; i < 5; i++) {
console.log(i)
}
在上面的代码中,警告在运行for循环之前弹出,但是
console.log('Promise Done')
是在for循环完全运行后打印,为什么会发生这种情况,如果promise是异步的,那么为什么console.log在for循环后打印?
答案 0 :(得分:4)
在上面的代码中,警告在运行for循环之前弹出
alert
绝对不会在之后那些console.log
来电时被调用,这是我在Chrome,Firefox和上运行您的代码时所看到的内容边缘。 then
处理程序始终异步调用,但是您的for
循环与调用then
添加回调的同步任务相同,因此循环肯定会在then
回调之前运行。
alert
是一个奇怪且不合时宜的事情。我可以想象一些浏览器可能不会呈现 console.log
的结果,直到您解除alert
,给定alert
&#39;停止用户界面行为。
如果您正在使用的浏览器中发生这种情况,那么这里是一个更可靠的事物序列指示器:
var actions = [];
function callPr() {
return new Promise(function(res, rej) {
setTimeout(function() {
actions.push("resolving promise");
res();
}, 0);
});
}
actions.push("creating promise");
callPr().then(function() {
actions.push("promise done");
// delay just to prove nothing else is waiting to happen
setTimeout(function() {
console.log(actions);
}, 800);
});
for (var i = 0; i < 5; i++) {
actions.push("loop " + i);
}
&#13;
.as-console-wrapper {
max-height: 100% !important;
}
&#13;
答案 1 :(得分:-2)
实际上是承诺是异步的,但它是非阻塞的,所以代码将继续我认为如果你有一个大循环你会注意到console.log将在循环之间,因为.then和循环将一起运行< / p>