[英]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: resolve
和reject
回調。
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.