在Javascript的承诺中,为什么可以';是否将错误传递给下一个链“.catch()”?

在Javascript的承诺中,为什么可以';是否将错误传递给下一个链“.catch()”?,javascript,asynchronous,promise,ecmascript-6,Javascript,Asynchronous,Promise,Ecmascript 6,以下是一个例子: var promise = new Promise(function(resolve, reject) { throw new Error('test'); }); promise.catch(function(error) { console.log(error + ' 1 '); return error }).catch(function(error) { console.log(error + ' 2 '); return error }) 代码的

以下是一个例子:

var promise = new Promise(function(resolve, reject) {
  throw new Error('test');
});
promise.catch(function(error) {
  console.log(error + ' 1 ');
  return error
}).catch(function(error) {
  console.log(error + ' 2 ');
  return error
})
代码的结果是:

Error: test 1 

可以看出,第二个
catch
调用不起作用。这是否意味着Promise无法使用catch的链语法处理错误?是否有方法将当前错误传递给下一个
catch()
调用?

返回错误不会使其命中下一个
catch
。您需要再次抛出该错误:

promise.catch(function(error) {
  console.log(error + ' 1 ');
  throw error
}).catch(function(error) {
  console.log(error + ' 2 ');
  return error
})
->错误:测试1
->错误:测试2

您必须再次抛出错误,而不仅仅是返回错误对象:

var promise = new Promise(function(resolve, reject) {
  throw new Error('test');
});
promise.catch(function(error) {
  console.log(error + ' 1 ');
  throw error
}).catch(function(error) {
  console.log(error + ' 2 ');
  return error
})
js没有“这是一个错误对象,所以抛出它”的内部概念-如果在您的第一个
catch()
之后有一个
then()
子句,那么操作将被推迟到该子句,如下所示:

var promise = new Promise(function(resolve, reject) {
  throw new Error('test');
});
promise.catch(function(error) {
  console.log(error + ' 1 ');
  return error
}).then(function(error) {
  console.log(error + ' 2 ');
  return error
})

希望这有帮助

你永远不会重犯错误。为什么返回值会被视为要捕获的错误?使用
抛出错误catch
返回内容,则表示您已经处理了问题,这是要继续处理的值。如果您还没有处理这个问题,请重试而不是返回。这基本上就像问为什么
try{try{try{throw new Error}catch(e){log(e);returne}}catch(e){log(e);returne}
不记录两次。因为你已经发现了错误。我想知道“这是一个错误对象,所以抛出'功能会是什么样子,甚至是它的意思。”@T.J.Crowder我编辑了我的措辞,所以我要gunna删除我的所有评论以清理答案:)