Javascript承诺异常处理

时间:2016-11-23 04:11:39

标签: javascript promise es6-promise

我正在尝试理解以下场景中的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",

2 个答案:

答案 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)

ErrorPromise中的.then将沿着Promise链向下传播,直到它遇到第一个处理程序,这可能是这两个中的一个:< / p>

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

其中.catch选项实际上只是语法糖:

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

在您的代码中,.then不包含处理程序,因此Error中的api会传播到.catch