Promise其它方法一

作者: wade3po | 来源:发表于2020-03-18 16:31 被阅读0次

    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

    相关文章

      网友评论

        本文标题:Promise其它方法一

        本文链接:https://www.haomeiwen.com/subject/julcyhtx.html