2016-11-23 147 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()将被调用。