【问题标题】:Promise is not immediately returned for function [duplicate]不会立即为函数返回承诺 [重复]
【发布时间】:2021-04-29 11:05:35
【问题描述】:

我试图想出一个简单的例子来展示 Promise 如何绕过阻塞调用,但是这个例子没有按照我期望的方式工作

function blockForLoopPromise() {
  return new Promise((resolve, reject) => {
    for (let i = 0 ; i < 10000000000 ; i++) {
      
    }
    resolve("done")
  })
}

blockForLoopPromise().then(() => console.log("DONE!"))
console.log("END")

在此示例中,直到长 for 循环完成后才调用“END”。不应该立即调用吗?

【问题讨论】:

    标签: javascript promise


    【解决方案1】:

    不应该立即调用吗?

    没有。传递给 Promise 构造函数的函数是同步调用的。

    来自MDN

    在构造新的 Promise 对象的过程中要被构造函数执行的函数。

    您还可以在specification 中看到该函数被构造函数立即调用(第 9 步)。

    【讨论】:

    • 我正在查看 MDN 文档,它说执行器函数是异步调用的:“通常,它的工作方式如下:执行器中的操作是异步的并提供回调”。仍在尝试摸索这个
    • 这句话的意思是你通常在执行器内部调用异步函数,而不是执行器本身是异步执行的。
    【解决方案2】:

    您可以更新到以下内容以获得您正在寻找的行为。 setImmediate 在节点中用于在事件循环的下一次迭代中执行函数

    function blockForLoopPromise() {
      return new Promise((resolve, reject) => {
        setImmediate(() => {
          for (let i = 0 ; i < 10000000000 ; i++) {
          
          }
          resolve("done")
        });
      });
    }
    
    blockForLoopPromise().then(() => console.log("DONE!")); 
    console.log("END");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-04
      • 2016-10-20
      • 2018-06-03
      • 2015-02-13
      相关资源
      最近更新 更多