Javascript承诺,then的返回承诺和catch方法

时间:2018-09-29 13:00:01

标签: javascript asynchronous ecmascript-6 promise es6-promise

与Promises一起鬼混,下面是代码:

let prom1 = new Promise((res, rej) => {
  res('res');
});

const resolvedProm1 = prom1.then((val) => {
  return val
});
console.log(resolvedProm1);

let prom2 = new Promise((res, rej) => {
  rej('rej');
});

const resolvedProm2 = prom2.catch((err) => {
  return err
});
console.log(resolvedProm2);

chrome devtools显示有关诺言的以下信息:

Promises, javascript promises

但是,我没想到会有这种特殊的输出。我所期望的是:

  • resolvedProm1和resolveProm2均为<fullfilled>,而不是<pending>。为什么它们待处理但未满?
  • solvedProm2被拒绝了,为什么promiseStatus显示它已解决?

2 个答案:

答案 0 :(得分:2)

在两种情况下,在兑现承诺之前都会打印承诺。发送到promise上下文中的内容将始终在当前调用堆栈释放后执行,因此控制台将首先运行到函数结束。

答案 1 :(得分:1)

  

resolvedProm1resolvedProm2都是Promises而不是。为什么它们待处理但未满?

因为它们是异步解决的。您正在记录它们,而它们仍未决。您会注意到,如果在console.logthen回调中添加了一些catch语句,则这些回调也尚未执行。

在检查以下内容时,您只会得到 [[PromiseStatus]] “已解决” (实际上应为“已满”)。在devtools中承诺价值,您可以在它们解决后进行

  

resolvedProm2被拒绝了,为什么promiseStatus显示它已解决?

否,您拒绝了prom2resolvedProm2.catch()调用的结果,其回调做了处理拒绝并返回了非错误结果。