【问题标题】:meaning of operation within executor of Promise is asynchronousPromise executor 内部操作的含义是异步的
【发布时间】:2021-07-19 09:45:36
【问题描述】:

在本文档中:MDN - Promise() constructor

有一句话:

  1. 执行器中的操作是异步的,并提供回调。

这是代码

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 中的代码完成,并且应该在“before promise”之后显示“not promise but after”。但似乎我不明白这句话的意思。谁能解释一下这是什么意思?

【问题讨论】:

  • Executor函数同步执行。 Promise 不用于异步处理;它们是 already asynchronous 操作的包装器,它会通知您 already asynchronous 操作是成功完成还是失败。
  • promise 不会自动启用多线程。你阻塞了主线程,promise 在这里无济于事
  • @evolutionxbox JavaScript 是单线程的。并发:Why doesn't JavaScript support multithreading?
  • 要做这样的事情,你必须在中间等待。您可以使用异步函数代替新的 Promise,并在循环中放置一个 await new Promise(r =&gt; setImmediate(r))
  • @jabaa 是的。我的观点是 promises 并没有启用它。我们同意

标签: javascript asynchronous promise


【解决方案1】:

让我们看看你引用的上下文:

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

  1. 执行器中的操作是异步的,并提供回调。

MDN 描述的是一个典型流程。

您传递给 Promise 构造函数的执行器中的操作不是异步的(这使得使用 Promise 毫无意义)。

【讨论】:

    【解决方案2】:

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

    如果您想要类似于您的用例的东西,即进行大量同步计算但偶尔让步以让其他事情发生,您可以使您的函数异步并让它等待(setTimeout 这里;可能是非标准的 @ 987654324@) 时不时地。

    您也可以不使用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");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-24
      • 2023-03-16
      • 2018-03-18
      • 1970-01-01
      • 2017-12-11
      • 2016-08-03
      相关资源
      最近更新 更多