【问题标题】:Does Promise resolution start the moment the promise is created? [closed]Promise 解决是否从创建 Promise 的那一刻开始? [关闭]
【发布时间】:2018-08-02 05:00:44
【问题描述】:

在下面的代码中,我注意到在调用 getProm() 的那一刻,promise 开始得到解决(我注意到运行代码时延迟了 5 秒)。

我想确认 Promise 是在创建时立即解决还是仅在以下 2 种情况下解决。 1) 只有当我们明确地执行 Promise.resolve 时才会解决 Promise 2) 我们使用 .then 关键字

function getProm(){
    var prom1 = new Promise((resolve,reject)=>{
        setTimeout(()=>{
            resolve("Promise is resolved")
        },5000)
    })
    return prom1
}
var mypromise = getProm()

【问题讨论】:

  • 我无法重现你所说的在下面的代码中,我注意到在调用 getProm() 的那一刻,promise 得到了解决。仅在我致电.then(或替代方案)后,承诺才得以解决
  • 你的说法没有意义。当您还“可以注意到 5 秒的延迟”时,您如何注意到“调用 getProm 的那一刻”发生了一些事情。如果延迟 5 秒,则不是调用它的时刻!
  • 当您调用 resolvereject 时,Promise 将得到解决。 .then() 对 Promise 的完成没有影响。
  • 如果您的问题是“Promise 函数中的代码无论如何都会运行吗?”,那么答案是“是”。只需将resolve() 替换为console.log() 并亲自查看。
  • @Adelin - 真的吗?我认为承诺会在 5000 毫秒后得到解决——不管其他任何事情

标签: javascript node.js promise es6-promise


【解决方案1】:

区分三个时刻:

  • 你传递给new Promise的回调被调用的那一刻:所谓的promise构造函数回调。这是即时的:它将在new Promise 表达式之后的任何其他代码之前执行。在您的情况下,这意味着 setTimeout 会立即执行。

  • 承诺解决的那一刻。当调用提供给 promise 构造函数回调的 resolvereject 函数时,就会发生这种情况。在您的情况下,这会在延迟 5 秒后发生。

  • 检测到已解决的承诺。这总是异步发生的:使用 ES6 承诺,您无法检测到承诺已同步解决,即使代码立即调用 resolve。您使用then 回调(或await)检测分辨率。在当前调用堆栈运行完成并被清空之前,不会调用此回调。无论您是否检测到此类解决方案,这都不会延迟承诺的实际解决方案。如果您在 10 分钟延迟后执行 then,它会在下一个微任务中触发 then 回调,即使承诺早已解决。你可以对同一个 Promise 进行多个 then 调用:它们都会触发它们的回调。

【讨论】:

  • 你说的这个microtask......这能解释为什么在今天早些时候的this answer I posted中,蓝鸟和原生承诺之间的console.log语句的顺序不同吗? Bluebird(以及包括我自己的其他承诺实现)的行为与我实际预期的一样(最后一个 .then 在第一个 settimeout 被“放置”在(消息?)队列上之后执行......因为这个队列是按照“任务”放在上面。作为原生承诺 .then 似乎跳过了这个队列(.then 被放在队列的头部?)
  • 是的,微任务队列是一个单独的队列,作为当前任务的一部分进行处理。只有当微任务队列为空时,任务才会完成,然后是通常的消息队列处理(其中还放置了setTimeout 事件)。 DOM Mutation 事件似乎也有一定的优先级(取决于浏览器),所以自定义的 Promise 实现(绑定到 DOM)可以尝试使用它。
  • 感谢您的澄清 - 让我整天困惑:p
猜你喜欢
  • 2019-07-05
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 2020-03-20
  • 2018-01-24
  • 2017-06-21
  • 2018-02-06
相关资源
最近更新 更多