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其它方法一

    Promise其它方法在一些场景里面使用还是蛮有用的,今天完善一下其它一些方法。 catch: 这个是最简单的,c...

  • Promise其它方法二

    race静态方法,只要有一个改变状态,不管成功失败都返回这个改变状态的值,如果是普通值之间成功返回: finall...

  • 一步步手写Promsie源码(二)

    Promise.all方法实现 Promise.resolve方法实现 Promise.finally方法实现 c...

  • Promise对象

    Promise对象 创造一个Promise实例 then方法 Promise实例生成以后,可以用then方法分别指...

  • Promise,async,await笔记

    Promise,async,await笔记 Promise 创建promise对象 Promise对象构造方法传入...

  • 详解ES6 Promise

    整理Promise提供的各种方法和错误处理方法。 1.Promise.resolve() 1.1 Promise....

  • 为原型添加方法

    手动添加数组方法 为promise添加实现方法 promise.finally promise.all promi...

  • Promise.finally、Promise.all、Prom

    Promise原型对象上的方法 Promise构造函数中定义的方法 1. Promise.prototype.fi...

  • js sleep

    // promise 在ES6的语法中,Promise是sleep方法异步的实现一种方式,借助Promise方法可...

  • 【promise-05】promise.all()与promis

    #promise.all()与promise.race() Promise.all()方法可以把多个promise...

网友评论

    本文标题:Promise其它方法一

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