Promise执行器中操作的含义是异步的



在本文档中:MDN-Promise((构造函数

有一个短语:

  1. executor中的操作是异步的,并提供回调

这是代码

console.log('before promise');
new Promise(function(resolve, reject) {
console.log('promise');

let j = 0;
for (i = 0; i < 1000000000; i++) {
j++;
}
resolve(1);
console.log('promise end');
}).then(function() {
console.log('then');
});
console.log('not promise but after');

它显示在控制台中

  • 承诺之前
  • 许诺
  • 承诺结束
  • 不是承诺而是之后
  • 那么

我认为一旦executor中的操作是异步的,那么Javascript就不应该等待executor内的代码完成,并且"不是承诺,而是在";应该显示在";承诺之前";。但我似乎不明白这句话的意思。能请某人解释一下这是什么意思吗?

让我们看看您引用的内容的上下文:

因此,鉴于以上所有内容,以下是典型流程的摘要:

  1. executor中的操作是异步的,并提供回调

MDN正在描述一个典型的流。

传递给Promise构造函数的executor中的操作不是异步的(这使得使用Promise变得毫无意义(。

承诺执行器是同步运行的——在async函数的情况下,直到其中的第一个await

如果你想要像你的用例一样的东西,即做大量的同步计算,但偶尔会让其他事情发生,你可以让你的函数异步,并让它不时等待(这里是setTimeout;可能是非标准的setImmediate(。

您也可以在不使用async的情况下做到这一点,但要做到正确有点困难。

const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
async function doThings() {
console.log("promise");
let j = 0;
for (i = 0; i < 1000000000; i++) {
j++;
if (i && i % 100000 == 0) await delay(0); // magic yield
}
console.log("promise end");
return j;
}
console.log("before promise");
doThings().then(function () {
console.log("then");
});
console.log("not promise but after");

最新更新