为什么承诺承诺仍在获得解决价值

时间:2019-07-30 04:35:35

标签: javascript es6-promise

我试图理解为什么带有null参数的promise catch仍然获得解析值1

var x = Promise.resolve(1);
var p1 = x.catch(null);
p1.then((x) => {
  console.log(x)
}); // logs 1

2 个答案:

答案 0 :(得分:1)

x解析时,其值为1 当您尝试捕获x时,它会返回x并添加了catch处理函数,因此p1引用x本身,但带有其他catch处理函数 现在,由于从x继承的p1已被解析,因此链接任何then方法将使用已解析的x参数运行,因此此行为

答案 1 :(得分:1)

它返回1,因为您的代码永远不会到达catch块。要实现它,您必须拒绝您的承诺。甚至是字面(Promise.reject())或抛出错误:

示例1:一切正常,没有拒绝:

Promise
.resolve(1)
.then(x => {
  console.log(x);
  return x + 1;
})
.then(x => {
  console.log(x);
  return x + 1;
})
.then(x => {
  console.log(x);
  return x + 1;
})
.catch(e => {
  console.log('an error!!'); // block not reached
});

示例2:拒绝承诺跳转到下一个catch块:

Promise
.resolve(1)
.then(x => {
  console.log(x);
  return x + 1;
})
.then(x => {
  console.log(x);
  throw Error('ops');
  return x + 1;
})
.then(x => { // block not reached
  console.log(x);
  return x + 1;
})
.catch(e => {
  console.log('an error!!');
});

示例3:catch块之后,它可以正常运行:

Promise
.resolve(1)
.then(x => {
  console.log(x);
  return x + 1;
})
.then(x => {
  console.log(x);
  throw Error('ops');
  return x + 1;
})
.catch(e => {
  console.log('an error!!');
  return 10;
})
.then(x => {
  console.log(x);
  return x + 1;
});