前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Promise其它方法一

Promise其它方法一

作者头像
wade
发布2020-04-23 16:18:17
2150
发布2020-04-23 16:18:17
举报
文章被收录于专栏:coding个人笔记coding个人笔记

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

catch:

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

代码语言:javascript
复制
catch(errCallback){
 return this.then(null, errCallback);
}
Promise.resolve()和Promise.reject():

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

代码语言:javascript
复制
static resolve(value){
 return new Promise((resolve, reject) => {
  resolve(value);
 })
}
static reject(value){
 return new Promise((resolve, reject) => {
  reject(value);
 })
}

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

代码语言:javascript
复制
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,就等待,所以添加一个判断方法:

代码语言:javascript
复制
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。这个方法简写:

代码语言:javascript
复制
if(isPromise(value)){
 return value.then(resolve, reject);
}

可以这样看代码:

代码语言:javascript
复制
let resolve = (value) => {
 if(isPromise(value)){
  value.then(res => resolve(res), err => reject(err))
  return;
 }
 //...
};

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

all方法:

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

代码语言:javascript
复制
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处理,如果都成功,我们要判断传入的数组长度跟当前的长度一样,就返回成功结果。

(完)

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-03-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 coding个人笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档