【问题标题】:Javascript promises setTimeout execution [duplicate]Javascript承诺setTimeout执行[重复]
【发布时间】:2020-08-26 17:05:10
【问题描述】:

我一直在玩 Promises,但我无法理解以下代码发生了什么:

const promise = new Promise((resolve, reject) => {
  console.log('Promise started')
  resolve('Success')
})

setTimeout(() => {
  console.log('Log inside first setTimeout')
}, 0)

promise.then(res => {
  console.log('Promise log after fulfilled ❌')
})

setTimeout(() => {
  console.log('Log inside second setTimeout')
}, 0)

输出是:

Promise started 
Promise log after fulfilled ❌ 
Log inside first setTimeout 
Log inside second setTimeout 

为什么不是下面的输出?

Promise started 
Log inside first setTimeout 
Log inside second setTimeout 
Promise log after fulfilled ❌ 

setTimeout(fn, 0)fn 调用和resolve()fn 调用之间,哪个优先?

是否依赖于浏览器的实现细节?

【问题讨论】:

    标签: javascript node.js promise runtime event-loop


    【解决方案1】:

    setTimeout 是一个宏任务 - 这些是在微任务之后解决的,其中包括 Promises。 setTimeout 是非阻塞的,因此代码在第一个 setTimeout 执行之前执行(包括 .then),然后是第二个 setTimeout 最后执行。

    【讨论】:

    • 嗨@jack,感谢您的快速回复。答案是直截了当且易于理解的。但是,如果您提供上述概念的参考链接会更有用。
    • @PavanGangireddy 请检查副本中的答案和 cmets。有几个博客和视频链接。
    • @PavanGangireddy 这是解决方案stackoverflow.com/questions/38752620/promise-vs-settimeout (tl;dr - promises 是微任务,这些是在 setTimeouts 之前执行的,它们是宏任务。setTimeout 也不会阻止代码执行,所以 promise 是在等待 setTimeout 时解决)
    • 反对票是我的。没有优先级之类的东西,也没有涉及“线程”。 “在返回之前解决承诺,看看它是否完成。”对我来说没有意义。
    • @JonasWilms 抱歉,术语错误。我将编辑我的帖子以反映我的 cmets 信息
    【解决方案2】:

    Promises 具有更高的优先级,因为它们在微任务队列中排队。首先处理微任务队列中的任务。然后处理其他计划任务,在这种情况下为setTimeout

    【讨论】:

      猜你喜欢
      • 2021-12-22
      • 2017-10-04
      • 2023-03-17
      • 2021-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多