让前端飞Web前端之路

Promise其它方法一

2020-03-18  本文已影响0人  wade3po

Promise其它方法在一些场景里面使用还是蛮有用的,今天完善一下其它一些方法。

catch:

这个是最简单的,catch其实就是没有成功方法resolve的then函数,所以catch方法:

catch(errCallback){

 return this.then(null, errCallback);

}

Promise.resolve()和Promise.reject():

这两个用法很简单,就是立马执行成功或者失败,所以直接返回一个Promise然后直接执行成功失败方法,这是一个静态方法:

static resolve(value){

 return new Promise((resolve, reject) => {

  resolve(value);

 })

}

static reject(value){

 return new Promise((resolve, reject) => {

  reject(value);

 })

}

然后这边引申出一个问题,如果我是这样调用:

Promise.resolve(new Promise((resolve, reject) => {

 setTimeout(() => {

  resolve(123);

 }, 3000)

})).then(res => {

 console.log(res);

})



Promise.reject(new Promise((resolve, reject) => {

 setTimeout(() => {

  resolve(321);

 }, 3000)

})).catch(err => {

 console.log(err);

})

Promise的resolve方法如果返回一个Promise,那么会等待这个Promise执行完,reject不会,所以我们在原来的resolve方法要加个判断,如果是Promise,就等待,所以添加一个判断方法:

function isPromise(x){

 if((typeof x === 'object' && x !== null) || typeof x === 'function'){

  if(typeof x.then === 'function'){

   return true;

  }

 };

 return false;

}

if(isPromise(value)){

value.then((res) => {

resolve(res);

}, (err) => {

reject(err);

})

return;

}

这个判断想写可以写跟resolvePromise一样,看是否是其它Promise。这个方法简写:

if(isPromise(value)){

return value.then(resolve, reject);

}

可以这样看代码:

let resolve = (value) => {

if(isPromise(value)){

value.then(res => resolve(res), err => reject(err))

return;

}

//...

};
``
应该就好理解多了,为什么可以那样简写。

all方法:

all方法也是一个静态方法,会返回所有成功之后结果,结果是按顺序的,只要有一个失败就是失败:

static all(promises) {

 return new Promise((resolve, reject) => {

  let resArr = [];

  let index = 0;

  let resCreat = (res, index) => {

   resArr[index] = res;

   index++;

   if(index === promises.length){

    resolve(resArr);

   }

  };

  for(let i = 0; i < promises.length; i++){

   let current = promises[i];

   if(isPromise(current)){

    current.then(y => {

     resCreat(y, i);

    }, r => {

     reject(r);

    })

   }else{

    resCreat(current, i);

   }

  }

 })

}

循环传入的数组,如果是promise实例,就调用then方法,处理结果,如果不是就直接当作普通值处理结果,这边不能用push,因为不同的参数都是异步的,我们要保证顺序,就只能用index处理,如果都成功,我们要判断传入的数组长度跟当前的长度一样,就返回成功结果。

image
上一篇 下一篇

猜你喜欢

热点阅读