我正在閱讀有關承諾和獲取的東西,並非常困惑。我從Introduction to fetch得到以下代碼。承諾鏈當被拒絕,但只有然後實施
我的問題是:如果status
返回被拒絕的promise
會發生什麼? then(json)
被鏈接後then(status)
,這是否意味着then(json)
不會做任何事情,因爲then(json)
只有當status
返回一個已解決的承諾纔會執行?或者這是否意味着如果狀態返回拒絕承諾,直至達到底部的catch
,並且catch
捕獲到錯誤,那麼鏈條只會繼續通過所有then
?
或者如果我錯了,這段代碼的正確解釋是什麼?
function status(response) {
if (response.status >= 200 && response.status < 300) {
return Promise.resolve(response)
} else {
return Promise.reject(new Error(response.statusText))
}
}
function json(response) {
return response.json()
}
fetch('users.json')
.then(status)
.then(json)
.then(function(data) {
console.log('Request succeeded with JSON response', data);
}).catch(function(error) {
console.log('Request failed', error);
});
「*那意味着(JSON)不會做任何事情,因爲那麼(JSON)僅被執行時的狀態returnes一個解決的承諾*?」 - 是的,成功回調(當承諾失敗時,'json')不會被執行。然而,事情發生了:'.then(...)'返回的承諾被拒絕,以致錯誤傳播。 「*或者是否意味着如果狀態回報被拒絕承諾,那麼鏈條就會持續通過所有這些目標,直到它到達底部*」 - 是的。 – Bergi
如果'.then(status)'階段被拒絕,只需在'.then(json,onRejected)'階段添加一個'onRejected'回調函數,你就可以更早地處理被拒絕的promise,並採取類似再次嘗試的動作等。 。 – Redu