搜尋

首頁  >  問答  >  主體

then(onFulfilled, undefined) - then(undefined, onRejected) - 為什麼catch() 會履行返回的promise?

我正在嘗試這段程式碼:

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粉446800329P粉446800329267 天前582

全部回覆(2)我來回復

  • P粉111627787

    P粉1116277872024-03-31 11:54:44

    程式碼與將 .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);
    });

    回覆
    0
  • P粉464082061

    P粉4640820612024-03-31 10:54:30

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

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

    回覆
    0
  • 取消回覆