Javascript Promise 异常处理

Javascript Promise Exception Handling

我试图了解以下场景中的承诺异常处理。第二个调试器语句首先停止,并记录错误。为什么是这样?我以为只有 '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",

请记住,承诺不是行动,而是价值。 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()

Promise.then 中的 Error 将沿着 Promise 链传播,直到它遇到第一个处理程序,它可以是这两个中的一个:

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

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

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

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