对Promise中的resolve,reject,catch的理

2018-11-05  本文已影响21人  风不会停7

.then()的时候到底是在then什么…
首先要理解…Promise是一个对象,有then()方法的对象
then()的入参是一个函数,通常在promise链中,入参是 一个返回promise的函数 ,这句话好像有点拗口,就是说入参是一个函数,这个函数会return一个promise对象。

如何破坏promise链

如果有这样一个promise链:

p1().then(p2).then(p3)
  .then((data) => {
    console.log('data: ' + data);
  })
  .catch((error) => {
    console.log('error: ' + error);
  });
 
function p1() {
  let p1 = new Promise((resolve, reject) => {
    console.log('p1 resolved');
    resolve(123);
  });
  return p1;
}
 
function p2() {
  let p2 = new Promise((resolve, reject) => {
    console.log('p2 rejected');
    reject(456);
  });
  return p2;
}
 
function p3() {
  let p3 = new Promise((resolve, reject) => {
    console.log('p3 resolved');
    resolve(789);
  });
  return p3;
}

上面这个例子,你看到的console.log会是这样:

p1 resolved
p2 rejected
error: 456

并没有看到 p3 的log,而是看到了error message,也就是说:
在一个promise链中,只要任何一个promise被reject,promise链就被破坏了,reject之后的promise都不会再执行,而是直接调用.catch方法,通过 .catch 能够清楚的判断出promise链在哪个环节出了问题。

//注意
let p = new Promise((resolve, reject) => {
    let result = 123;
    reject(result);
})
// 只会被第一种方式reject操作失败的结果
p.then((result)=>{ 
    console.log('success:',result);
}, (result)=>{ 
    console.log('fail:',result);
}).then(() => {
    console.log(456);
}).catch((result)=>{ 
    console.log('error:',result);
})
//输出结果
// "fail: 123"
// "456"

非Promise链中reject不会影响后面.then()的执行,并且如果reject和catch两种方式同时使用的话,只会被第一种方式reject操作失败的结果。

上一篇下一篇

猜你喜欢

热点阅读