繁体   English   中英

Promise 启动太早

[英]Promise starts too early

我有以下 promise:

const promise = new Promise((resolve,reject) => {
  setTimeout(()=> { resolve('Hello')},4000);
});

后来,我这样称呼它:

promise.then((msg) => {console.log(msg)});

由于超时,我期待在调用then后 4 秒显示“Hello”消息,但实际上它是立即显示的......

我肯定错过了什么:什么?

我这样称呼它

您不会“呼叫” promise。 它不是 function(尽管它确实有方法)。 从这个问题我了解到你做了第一部分( const promise = new Promise(/*...*/); ),然后做了第二部分( promise.then(/*...*/); ),并且您希望计时器在您执行then启动,而不是在您new Promise时启动。

但是 Promises 的工作方式是,你的计时器是在你new Promise时启动的,而不是在你调用then时启动的。 您传入new Promisepromise 执行器函数)的 function 被同步立即调用。 其目的是启动 promise 将报告完成的操作。

这可能有助于使其更加清晰:

 const start = Date.now(); function log(msg) { const elapsed = String(Date.now() - start).padStart(4, " "); console.log(`${elapsed}: ${msg}`); } log("A"); const promise = new Promise((resolve, reject) => { log("B: Starting 5000ms timer"); setTimeout(() => { resolve("Hello"); }, 5000); log("C"); }); log("D: Waiting 2000ms before calling `then`"); setTimeout(() => { log("F: Calling `then`"); promise.then((msg) => { log("G"); log(msg) }); }, 2000); log("E");

注意 output 是

   0: A
   1: B: Starting 5000ms timer
   2: C
   2: D: Waiting 2000ms before calling `then`
   2: E

然后大约两秒钟后:

2002: F: Calling `then`

然后大约三秒钟后(自开始以来五秒钟)

5002: G
5004: Hello

注意事项:

  • promise 执行器立即同步运行,并启动其 5 秒定时器
  • then你什么时候打电话都没关系。 then我等了 2 秒,但在总共5 秒(不是 7 秒)后仍然得到了履行回调

我上面描述的是承诺的标准行为。 有(不幸的是,在我看来)有少数类似于 promise 的东西的行为略有不同,它们确实在开始他们的过程之前等待第一次调用then 这些不是典型的,但遗憾的是它们确实存在。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM