为什么javascript promise在使用alert和console.log的情况下表现得很奇怪?

时间:2018-06-13 07:17:03

标签: javascript asynchronous promise

我有以下代码,

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循环后打印?

2 个答案:

答案 0 :(得分:4)

  

在上面的代码中,警告在运行for循环之前弹出

alert绝对不会在之后那些console.log来电时被调用,这是我在Chrome,Firefox和上运行您的代码时所看到的内容边缘。 then处理程序始终异步调用,但是您的for循环与调用then添加回调的同步任务相同,因此循环肯定会在then回调之前运行。

然而,

alert是一个奇怪且不合时宜的事情。我可以想象一些浏览器可能不会呈现 console.log的结果,直到您解除alert,给定alert&#39;停止用户界面行为。

如果您正在使用的浏览器中发生这种情况,那么这里是一个更可靠的事物序列指示器:

&#13;
&#13;
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;
&#13;
&#13;

答案 1 :(得分:-2)

实际上是承诺是异步的,但它是非阻塞的,所以代码将继续我认为如果你有一个大循环你会注意到console.log将在循环之间,因为.then和循环将一起运行< / p>