2017-08-14 60 views
0

我正在閱讀有關承諾和獲取的東西,並非常困惑。我從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); 
    }); 
+0

「*那意味着(JSON)不會做任何事情,因爲那麼(JSON)僅被執行時的狀態returnes一個解決的承諾*?」 - 是的,成功回調(當承諾失敗時,'json')不會被執行。然而,事情發生了:'.then(...)'返回的承諾被拒絕,以致錯誤傳播。 「*或者是否意味着如果狀態回報被拒絕承諾,那麼鏈條就會持續通過所有這些目標,直到它到達底部*」 - 是的。 – Bergi

+0

如果'.then(status)'階段被拒絕,只需在'.then(json,onRejected)'階段添加一個'onRejected'回調函數,你就可以更早地處理被拒絕的promise,並採取類似再次嘗試的動作等。 。 – Redu

回答

1

在我試圖理解的承諾初期,我想到了。於是鏈條爲兩條鏈...成功和拒絕

拒絕或錯誤導致的「執行」從成功到「跳」甩

如果拒絕處理程序返回的值是不是拒收承諾,「執行」,將「跳」到成功鏈

注:我最早接觸到的承諾沒有.catch ...因爲.then實際上接受兩個參數onFullfilledonRejected - 如果任這些是不是function它被忽略 -

所以,你的代碼可以寫成:

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

function log(data) { 
    console.log(data); 
} 

function handleError(error) { 
    console.log('Request failed', error); 
} 

fetch('users.json') 
    .then(status, null) 
    .then(json,  null) 
    .then(log,  null) 
    .then(null,  handleError); 

現在,鑑於函數統計錯誤,「上是相當明確的拒絕」鏈‘效應’(我真的需要考慮更好的術語),並沒有什麼在reject鏈直到最底層,因此,這是獲取一些執行

.catch下一個代碼承諾圖書館我。只不過以下

Promise.prototype.catch = function catch(onRejected) { 
    return this.then(null, onRejected); 
}; 
0

當承諾被拒絕它直接進入.catch()而不執行別的鏈。

因此,如果status返回Promise.reject只有catch函數將執行。