我正在嘗試這段程式碼:
let with999 = Promise.resolve(999); let returnCatch = with999 .catch(reason => { console.log("catch: " + reason); }); returnCatch.then(data => { console.log("then: " + data); });
當我突然意識到:
承諾with999
已履行 因此 catch()
方法未執行< /strong>,但是, catch()
傳回的Promise(本例為returnCatch
)最終fulfilled,其值與 相同>with999
.
所以,我的問題是,為什麼 catch()
最終實現了 returnCatch
承諾?
我預期returnCatch
會掛起(因為catch()
未執行)並使用then()< /code> 什麼都不會發生。
同樣的情況發生在“做相反的事情”,then()
拒絕一個承諾:
let rejected = Promise.reject(new Error('Ups!')); let returnThen = rejected .then(reason => { console.log("then: " + reason); }); returnThen. catch(data => { console.log("catch: " + data); });
有人可以跟我解釋一下發生了什麼事嗎?
程式碼與將 .then 和 .catch 連結到初始 Promise 相同。情況並非如此,為 catch 建立一個新變數需要將其拒絕,然後透過管道傳遞到下一個 then。
將其視為一次編寫相同的語句而不使用多個變量,這樣的行為會更有意義。由於 Promise 已解析,因此第一個 .then 將被執行,如果 Promise 被拒絕,則第一個 .catch 將被執行,無論順序或聲明它們或您使用多少個變數來執行此操作。
編輯: 此程式碼片段與上面的程式碼片段相同,傳遞的是相同的 Promise。
「為什麼」的問題總是很難回答,但基本上可以歸結為:因為它有用。
也許從
catch()
傳遞履行結果的行為來看,這一點並不是很明顯,但請看一下.then()
傳遞的第二個範例關於拒絕:我們希望執行.catch()
回調,以處理承諾鏈中早期出現的任何錯誤。我們不希望 Promise 鏈在中間停止(Promise 保持掛起狀態),因為出現錯誤且.then()
回呼未執行。您已經意識到此行為在
.then(handleResult)
和.catch(handleError)
之間是對稱的。但請注意,這些其實只是.then(handleResult, null)
和.then(null, handleError)
的簡化語法。then
方法 其實有兩個參數,一個用於處理履行,一個用於處理拒絕。您可以(而且通常應該)同時通過這兩項考試。.then()
傳回的Promise 會根據對應處理程序的結果進行解析(如果呼叫拋出例外則被拒絕),Promise 鏈背後的想法是它總是在最初的承諾得到解決後才解決。如果未提供相應的回調,則預設僅傳遞結果- 無論是.then(null, null)
、.then(null, handleError)
均已滿足Promise 或被拒絕的Promise 上的.then(handleResult, null)
。