我正在尝试理解以下场景中的promise异常处理。第二个调试器语句首先停止,并记录错误。为什么是这样?我认为只有在'then'块引发错误时才能输入异常块?
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",
答案 0 :(得分: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()
。
答案 1 :(得分:0)
Error
或Promise
中的.then
将沿着Promise
链向下传播,直到它遇到第一个处理程序,这可能是这两个中的一个:< / p>
.then(function(){}, function(err){}) // second callback is the handler
.catch(function(err){})
其中.catch
选项实际上只是语法糖:
.then(null, function(err){})
在您的代码中,.then
不包含处理程序,因此Error
中的api
会传播到.catch
。