then(onFulfilled, undefined) - then(undefined, onRejected) - 為什麼catch() 會履行返回的promise?
P粉446800329
P粉446800329 2024-03-30 23:21:22
0
2
580

我正在嘗試這段程式碼:

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);
});

有人可以跟我解釋一下發生了什麼事嗎?

P粉446800329
P粉446800329

全部回覆(2)
P粉111627787

程式碼與將 .then 和 .catch 連結到初始 Promise 相同。情況並非如此,為 catch 建立一個新變數需要將其拒絕,然後透過管道傳遞到下一個 then。

將其視為一次編寫相同的語句而不使用多個變量,這樣的行為會更有意義。由於 Promise 已解析,因此第一個 .then 將被執行,如果 Promise 被拒絕,則第一個 .catch 將被執行,無論順序或聲明它們或您使用多少個變數來執行此操作。

編輯: 此程式碼片段與上面的程式碼片段相同,傳遞的是相同的 Promise。

let with999 = Promise.resolve(999).catch(reason => {
  console.log("catch: " + reason);
}).then(data => {
  console.log("then: " + data);
});
P粉464082061

「為什麼」的問題總是很難回答,但基本上可以歸結為:因為它有用。

也許從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)

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板