promise的.then返回的一个新promise,他的状态和值,问题好大

fcxh
  • 432

promise的.then返回的一个新promise,他的状态和值,有很多问题。

我一直是这么理解的:

新的promise 的状态取决于原promise的状态,值呢,有2种情况
  1. 如果原promise为resovel。那么值等于原promise的.then函数中的返回值,没有返回值就等于原promise的resolve值
  2. 如果原promise为reject, 那么值等于原promise的reject的值

    Promise.reject('a error')
        .then(res => console.log('res'), err => console.log('err'))
        .then(res => console.log('res'), err => console.log('err'));

结果是:
err
res

上来状态就不对,不理解第二个为啥是res

回复
阅读 4.5k
4 个回答

网上找到的代码,可以参考这里:

如果then()方法中返回了一个参数值,那么返回的Promise将会变成接收状态。
如果then()方法中抛出了一个异常,那么返回的Promise将会变成拒绝状态。
如果then()方法调用resolve()方法,那么返回的Promise将会变成接收状态。
如果then()方法调用reject()方法,那么返回的Promise将会变成拒绝状态。
如果then()方法返回了一个未知状态(pending)的Promise新实例,那么返回的新Promise就是未知状态。
如果then()方法没有明确指定的resolve(data)/reject(data)/return data时,那么返回的新Promise就是接收状态,可以一层一层地往下传递。

参考文章
https://segmentfault.com/a/11...

 Promise.reject('a error')
 .then(res => console.log('res'), err => console.log('err'))
 .then(res => console.log('res'), err => console.log('err'));

先分解一下:

var promise =  Promise.reject('a error').  // 第一行
var promise1 = promise.then(res => console.log('res'), err => console.log('err'))// 第二行
promise1.then(res => console.log('res'), err => console.log('err')); // 第三行

然后再看:
promise1 接收了 第二行err=>console.log("err") 的返回值,是undefined,所以promise1是 resolve状态

那么第三行的执行结果就是 打印res

这和JS的设计有关,JS的错误处理是顺序的
不单单是promise的错误处理这样,try..catch..也是一样的
举一个简单的例子:

try {
  try {
    x=x;
  } catch(e) {
    x=1;
  };
  x=2;
} catch(e) {
  x=3;
}

在这里一样的,里面的try...catch语句的错误被吞掉了,或者说被处理了
promise的错误也是一样的,说这是局限也可以,其实也许JS的设计就这样

因为你第二行的then中的reject方法并没有返回值,那么由于函数默认返回的是undefined,既不是错误,也不是其他啥的,默认就resolve掉了,由此这个新的promise状态为resolve,由此接下来会解析到第一个函数,建议先看看别人的简单实现,这样方便自己参照理解~

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
你知道吗?

宣传栏