鍍金池/ 問(wèn)答/HTML/ promise的.then返回的一個(gè)新promise,他的狀態(tài)和值,問(wèn)題好大

promise的.then返回的一個(gè)新promise,他的狀態(tài)和值,問(wèn)題好大

promise的.then返回的一個(gè)新promise,他的狀態(tài)和值,有很多問(wèn)題。

我一直是這么理解的:

新的promise 的狀態(tài)取決于原promise的狀態(tài),值呢,有2種情況
  1. 如果原promise為resovel。那么值等于原promise的.then函數(shù)中的返回值,沒(méi)有返回值就等于原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'));

結(jié)果是:
err
res

上來(lái)狀態(tài)就不對(duì),不理解第二個(gè)為啥是res

回答
編輯回答
挽青絲

網(wǎng)上找到的代碼,可以參考這里:

如果then()方法中返回了一個(gè)參數(shù)值,那么返回的Promise將會(huì)變成接收狀態(tài)。
如果then()方法中拋出了一個(gè)異常,那么返回的Promise將會(huì)變成拒絕狀態(tài)。
如果then()方法調(diào)用resolve()方法,那么返回的Promise將會(huì)變成接收狀態(tài)。
如果then()方法調(diào)用reject()方法,那么返回的Promise將會(huì)變成拒絕狀態(tài)。
如果then()方法返回了一個(gè)未知狀態(tài)(pending)的Promise新實(shí)例,那么返回的新Promise就是未知狀態(tài)。
如果then()方法沒(méi)有明確指定的resolve(data)/reject(data)/return data時(shí),那么返回的新Promise就是接收狀態(tài),可以一層一層地往下傳遞。

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

2017年4月13日 03:19
編輯回答
柒喵

這和JS的設(shè)計(jì)有關(guān),JS的錯(cuò)誤處理是順序的
不單單是promise的錯(cuò)誤處理這樣,try..catch..也是一樣的
舉一個(gè)簡(jiǎn)單的例子:

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

在這里一樣的,里面的try...catch語(yǔ)句的錯(cuò)誤被吞掉了,或者說(shuō)被處理了
promise的錯(cuò)誤也是一樣的,說(shuō)這是局限也可以,其實(shí)也許JS的設(shè)計(jì)就這樣

2018年3月14日 05:27