[英]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 Promise
( promise 執行器函數)的 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
注意事項:
then
你什么時候打電話都沒關系。 then
我等了 2 秒,但在總共5 秒(不是 7 秒)后仍然得到了履行回調我上面描述的是承諾的標准行為。 有(不幸的是,在我看來)有少數類似於 promise 的東西的行為略有不同,它們確實在開始他們的過程之前等待第一次調用then
。 這些不是典型的,但遺憾的是它們確實存在。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.