专栏首页coding个人笔记Promise其它方法一

Promise其它方法一

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

(完)

本文分享自微信公众号 - coding个人笔记(gh_2ce38b49dae1),作者:wade

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-03-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • ES6之Promise对象

    Promise对象其实就是解决异步用的,比回调函数和事件更合理更强大,由ES6写进语言标准,统一了用法,然后提供了原生Promise对象。

    wade
  • Promise的几个方法

    我们都会觉得虽然是链式调用,对比回调会清晰一点,但是并没有想象中的那么美好。所以Promise提供了几个方法。

    wade
  • Promise其它方法二

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

    wade
  • Promise/async/Generator实现原理解析

    笔者刚接触async/await时,就被其暂停执行的特性吸引了,心想在没有原生API支持的情况下,await居然能挂起当前方法,实现暂停执行,我感到十分好奇。好...

    Nealyang
  • JavaScript——Promise

    Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,...

    FinGet
  • 这一次,彻底弄懂 Promise 原理

    Promise 必须为以下三种状态之一:等待态(Pending)、执行态(Fulfilled)和拒绝态(Rejected)。一旦Promise 被 resolv...

    winty
  • 手写一个Promise/A+,完美通过官方872个测试用例

    前段时间我用两篇文章深入讲解了异步的概念和Event Loop的底层原理,然后还讲了一种自己实现异步的发布订阅模式:

    蒋鹏飞
  • ES6中的Promise深入学习

    Promise是异步编程的一种新的解决方案,比传统的解决方案(纯回调函数)更加的方便和强大。简单来说,Promise就是一个容器,里面保存着某个未来才会结束的事...

    帅的一麻皮
  • Promise 与 RxJS

    首先是需要源源不断的流出数据的场景,因为Promise是一次性的,不适合做这类工作。 比如说把事件/定时器抽象成Rx的Observable更合适,事件可以响应很...

    剑行者
  • 图解 Promise 实现原理(一)—— 基础实现

    很多同学在学习 Promise 时,知其然却不知其所以然,对其中的用法理解不了。本系列文章由浅入深逐步实现 Promise,并结合流程图、实例以及动画进行演示,...

    2020labs小助手

扫码关注云+社区

领取腾讯云代金券