2016-11-23 146 views
-1

我想了解承諾異常處理在以下情況。第二個調試器語句首先停止,並記錄一個錯誤。爲什麼是這樣?我認爲只有在'then'塊發生錯誤時才能輸入異常塊?Javascript承諾異常處理

api.then(response => { 
    debugger; //1 
    dispatch(fetchReceive(response)); //never executes 
}) 
.catch((err) => { 
    debugger; //2 
    console.error(err); //err.status = 404 
}); 

我用下面的NPM包:

"babel-cli": "6.14.0", 
"babel-core": "6.9.1", 
"babel-loader": "6.2.4", 
"babel-plugin-transform-class-properties": "6.10.2", 
"babel-plugin-transform-object-rest-spread": "6.8.0", 
"babel-plugin-transform-react-constant-elements": "6.9.1", 
"babel-plugin-transform-react-inline-elements": "6.8.0", 
"babel-polyfill": "6.16.0", 
"babel-preset-es2015": "6.9.0", 
"babel-preset-es2017": "6.16.0", 
"babel-preset-react": "6.5.0", 
"babel-register": "6.9.0", 
+2

如果'api'是被拒絕的承諾,它也可以被輸入,而不需要'.then',所以你的問題與babel無關,它只是Promises的工作方式 –

+0

其實它取決於'api '因爲'api'可能拋出被拒絕的承諾或在處理它時拋出異常。如果api執行成功,那麼'block'總是被執行。 –

回答

0

ErrorPromise或在.then,直到它遇到第一個處理程序,它可以是這兩個中的一個將向下傳播的Promise鏈:

.then(function(){}, function(err){}) // second callback is the handler 
.catch(function(err){}) 

其中.catch選項實際上只是語法糖爲:

.then(null, function(err){}) 

在你的代碼中.then不包含處理器,因此在的傳播到.catch

0

記住,承諾不行動,他們的值。 api是某個調用的結果,並且該結果可能已經是錯誤。

const api = Promise.reject(new Error("I'm rejected!")); 

api 
    .then(value => console.log("I'm resolved!", value)) 
    .catch(err => console.error("I'm rejected!", err.message)); 

在這種情況下,.then()將跳過.catch()將被調用。