簡體   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