簡體   English   中英

JavaScript 承諾中的隱式“解決”

[英]Implicit `resolve` in JavaScript promises

我在 JavaScript 中使用了帶有setTimeout的承諾,我得到了一些神秘的行為。 我看到一切正常,我無法解釋。

假設我有這個 function:

function f(callback) {
  setTimeout(() => callback(13), 3000);
}

當我在沒有回調的情況下調用它時,我得到了一個最預期的錯誤:

> f()
undefined
> Uncaught TypeError: callback is not a function

當我使用實際回調調用它時,一切正常:

> f(console.log)
undefined
> 13

“問題”

到目前為止,一切都按計划進行,但是當我調用包裝在 promise 中的f()時,似乎不再需要callback參數:

> new Promise(f).then(console.log)
Promise { <pending> }
> 13

慢一點,如果我存儲 promise,它最終有一個值:

> p = new Promise(f)
Promise { <pending> }
> p
Promise { <pending> }
> p // after 3 seconds
Promise { 13 }
>

這發生在瀏覽器和節點上。

問題: f怎么可能根本不抱怨缺少callback 13如何分配為 promise 值?

TL;DR === false我知道我應該算我的祝福,因為它正在工作,但文檔似乎沒有提到任何隱藏的默認機制來處理我能找到的這種情況。 我得到的只是一個簡短的介紹,然后是一個快速前進的路徑,進入鏈接和更高級的模式。 我需要確保我可以在更復雜的情況下復制這種行為。

f 怎么可能根本不抱怨缺少回調?

您提供給 promise 的 function確實收到 arguments: resolvereject回調。

Promise 的正常使用如下所示:

return new Promise((resolve, reject) => {
  // call resolve() on success
  // call reject() on error
});

值 13 如何分配為 promise 值?

當您的超時到期時,您正在調用resolve(13)

讓我們將 f 移至 promise 構造函數...

new Promise(function f(callback) {
  setTimeout(() => callback(13), 3000);
}).then(console.log)

然后讓我們添加另一個參數...

new Promise(function f(callback, reject) {
  setTimeout(() => callback(13), 3000);
}).then(console.log)

並重命名回調以解決:

new Promise(function f(resolve, reject) {
  setTimeout(() => resolve(13), 3000);
}).then(console.log)

是不是很眼熟?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM