ES6中的Promise.all()和Promise.race()函数的实现方法

目录
  • ES6中的Promise.all()和Promise.race()函数
  • 补充:ES6 Promise.race和Promise.all方法
    • 一、Pomise.all的使用
    • 二、Promise.race的使用

ES6中的Promise.all()和Promise.race()函数

Promise.all() 方法用于将多个 Promise 实例,包装成一个新的 Promise 实例。

var pAll = Promise.all([p1, p2, p3])

Promise.all 方法的参数不一定是数组,但是必须具有 iterator 接口,且返回的每个成员都是 Promise 实例。

返回值 pAll 的状态由 p1、p2、p3 决定,分成两种情况:

  • 只有p1、p2、p3的状态都变成fulfilled,p的状态才会变成fulfilled,此时p1、p2、p3的返回值组成一个数组,传递给p的回调函数。
  • 只要p1、p2、p3之中有一个被rejected,p的状态就变成rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数。

手写实现Promise.all()函数:

var PromiseAll = function (promises) {
  return new Promise((resolve, reject) => {
    // 判断是否具有 iterator 接口:return typeof promises[Symbol.iterator] === 'function'
    if (typeof promises[Symbol.iterator] !== 'function') {
      reject(`TypeError: ${promises} is not iterable`)
    }
    if (promises.length === 0) {
      return resolve([])
    }
    const len = promises.length
    var result = []
    for (let p of promises) {
      Promise.resolve(p).then(res => {
        result.push(res)
        if (result.length === len) {
          resolve(result)
        }
      }).catch(err => {
        reject(err)
      })
    }
  })
}

验证使用PromiseAll():

const p1 = Promise.resolve(3) // 等价于 new Promise((resolve, reject) => resolve(3))
const p2 = true
const p3 = 'hello'
const p4 = Promise.reject('rej')
var pAll = PromiseAll([p1, p2, p3]).then(res => {
  console.log('pAll-res:', res) // [3, true, 'hello']
}).catch(err => {
  console.log('pAll-err:', err) // 有reject就输出第一个reject的结果 Error: fail
})

Promise.race() 方法同样是将多个 Promise 实例,包装成一个新的 Promise 实例。

var pRace = Promise.race([p1, p2, p3])

只要p1、p2、p3之中有一个实例率先改变状态,p的状态就跟着改变。

那个率先改变的Promise实例的返回值,就传递给p的返回值。

输出第一个获取到的结果,无论是resolve还是reject

手写实现Promise.race()函数:

var PromiseRace = function (promises) {
  return new Promise((resolve, reject) => {
    // 判断是否具有 iterator 接口:return typeof promises[Symbol.iterator] === 'function'
    if (typeof promises[Symbol.iterator] !== 'function') {
      reject(`TypeError: ${promises} is not iterable`)
    }
    if (promises.length === 0) {
      return resolve([])
    }
    for (let p of promises) {
      Promise.resolve(p).then(res => {
        resolve(res)
      }).catch(err => {
        reject(err)
      })
    }
  })
}

验证使用PromiseRace():

const p1 = Promise.resolve(3) // 等价于 new Promise((resolve, reject) => resolve(3))
const p2 = true
const p3 = 'hello'
const p4 = Promise.reject('rej')
var pRace = PromiseRace([p1, p2, p3]).then(res => {
  console.log('pRace-res:', res) // 3
}).catch(err => {
  console.log('pRace-err:', err)
})

补充:ES6 Promise.race和Promise.all方法

一、Pomise.all的使用

Promise.all可以将多个Promise实例包装成一个新的Promise实例。同时,成功和失败的返回值是不同的,成功的时候返回的是一个结果数组,而失败的时候则返回最先被reject失败状态的值。

eg:

let p1 = new Promise((resolve, reject) => {
  resolve('成功了')
})

let p2 = new Promise((resolve, reject) => {
  resolve('success')
})

let p3 = Promse.reject('失败')

Promise.all([p1, p2]).then((result) => {
  console.log(result)               //['成功了', 'success']
}).catch((error) => {
  console.log(error)
})

Promise.all([p1,p3,p2]).then((result) => {
  console.log(result)
}).catch((error) => {
  console.log(error)      // 失败了,打出 '失败'
})

eg:

let wake = (time) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(`${time / 1000}秒后醒来`)
    }, time)
  })
}

let p1 = wake(3000)
let p2 = wake(2000)

Promise.all([p1, p2]).then((result) => {
  console.log(result)       // [ '3秒后醒来', '2秒后醒来' ]
}).catch((error) => {
  console.log(error)
})

Promse.all在处理多个异步处理时非常有用,比如说一个页面上需要等两个或多个ajax的数据返回之后才正常显示,在此之前只显示loading图标。
eg:

let wake = (time) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(`${time / 1000}秒后醒来`)
    }, time)
  })
}

let p1 = wake(3000)
let p2 = wake(2000)

Promise.all([p1, p2]).then((result) => {
  console.log(result)       // [ '3秒后醒来', '2秒后醒来' ]
}).catch((error) => {
  console.log(error)
})

需要特别注意的是,Promise.all获得的成功结果的数组里面的数据顺序和Promise.all接收到的数组顺序是一致的,即p1的结果在前,即便p1的结果获取的比p2要晚。这带来了一个绝大的好处:在前端开发请求数据的过程中,偶尔会遇到发送多个请求并根据请求顺序获取和使用数据的场景,使用Promise.all毫无疑问可以解决这个问题。

二、Promise.race的使用

  • 顾名思义,Promse.race就是赛跑的意思,意思就是说,Promise.race([p1, p2,
  • p3])里面哪个结果获得的快,就返回那个结果,不管结果本身是成功状态还是失败状态。Promise.race方法同样是将多个 Promise 实例,包装成一个新的 Promise 实例。Promise.race方法的参数与Promise.all方法一样,如果不是 Promise
  • 实例,就会先调用下面讲到的Promise.resolve方法,将参数转为 Promise 实例,再进一步处理。

eg:

let p1 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve('success')
  },1000)
})

let p2 = new Promise((resolve, reject) => {
  setTimeout(() => {
    reject('failed')
  }, 500)
})

Promise.race([p1, p2]).then((result) => {
  console.log(result)
}).catch((error) => {
  console.log(error)  // 打开的是 'failed'
})

到此这篇关于ES6的Promise.all()和Promise.race()函数的文章就介绍到这了,更多相关Promise.all()和Promise.race()函数内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 如何利用JS实现一个可左右拉伸的滑块效果

    目录 前言 需求 方案 源码 后言 总结 前言 上月我一朋友,让我帮他实现一个效果,话说是他公司产品觉得自家项目的制作gif功能用户体验差,看到了别人的效果,于是就"挥刀霍霍"向了我那朋友,具体我们看下效果. 别人家的效果 自家的效果 用的是 element ui的 滑块 果然还是别人家的效果,话说这个忙还是得帮,下面开始正题 需求 动手之前我们先捋一捋需求 滑块不能超出临界值(不能滑出轨道) 手动进行向左.向右.滑块整体左右滑动 鼠标对滑块左按钮.右按钮.中间按钮 分别可以向左拉伸.

  • js Promise并发控制数量的方法

    目录 问题 背景 思路 & 实现 问题 要求写一个方法控制 Promise 并发数量,如下: promiseConcurrencyLimit(limit, array, iteratorFn) limit 是同一时间执行的 promise 数量,array 是参数数组,iteratorFn 每个 promise 中执行的异步操作. 背景 开发中需要在多个promise处理完成后执行后置逻辑,通常使用Promise.all: Primise.all([p1, p2, p3]).then((res)

  • 一文详解Promise.race()方法功能及应用场景

    目录 正文 什么是 Promise.race() 方法 Promise.race() 方法的应用场景 Promise.race() 方法的错误处理 Promise.race() 添加超时功能 Promise.race() 取消异步操作 结论 正文 当我们需要同时发起多个异步请求并在其中任意一个请求完成后得到响应时,可以使用 Promise.race() 方法.本文将对 Promise.race() 方法进行深入理解和实践. 什么是 Promise.race() 方法 Promise.race()

  • Promise对象all与race方法手写示例

    目录 前言 Promise.all 介绍 手写 Promise.race 介绍 手写 前言 在理解了手写promsie.then的方法后,再来看它的其他方法,感觉真的简单了不少. Promise.all 介绍 Promise.all()方法用于将多个 Promise 实例,包装成一个新的 Promise 实例. const p = Promise.all([p1, p2, p3]); 上面代码中,Promise.all()方法接受一个数组作为参数,p1.p2.p3都是 Promise 实例.另外

  • 深入理解JS中的Promise.race控制并发量

    目录 开篇 一.Promise.race 二.并发效果展示 三.代码 总结与思考 开篇 比如在开发中会进行一系列的网络请求,但是有些情况需要控制一下网络请求请并发量.这里简单的用 Promise.race 及 await 的特性来理解一下,如何对任务的并发量进行控制. 一.Promise.race Promise.race 作用就是将多个异步任务包裹起来,当有一个完成的话,那么就会触发 then 事件.除了这个不错的特性方法外,await 这个关键字也比较有用,可以这样理解,await 后面的代

  • C#中加载dll并调用其函数的实现方法

    C#编程中,调用封装dll中的函数是高频使用的.那么,如何在程序中加载dll并调用其中的函数呢?更进一步的,如何在主程序中对自己封装的dll中的函数进行调试呢? 加载dll-添加引用 添加引用的意思是让程序生成时根据配置的路径去加载相应的dll.其引用的步骤如下图所示: 解决方案->引用-> 添加引用-> 浏览-> 选择dll所在的路径->确定 导入命名空间.实例化对象.调用函数 只有导入该dll的命名空间,才能使用该空间下的类.因此,在引用了dll之后的第一步是导入命名空间

  • ES6中的Promise.all()和Promise.race()函数的实现方法

    目录 ES6中的Promise.all()和Promise.race()函数 补充:ES6 Promise.race和Promise.all方法 一.Pomise.all的使用 二.Promise.race的使用 ES6中的Promise.all()和Promise.race()函数 Promise.all() 方法用于将多个 Promise 实例,包装成一个新的 Promise 实例. var pAll = Promise.all([p1, p2, p3]) Promise.all 方法的参数

  • 浅析Javascript ES6中的原生Promise

    前言 一个 Promise 对象可以理解为一次将要执行的操作(常常被用于异步操作),使用了 Promise 对象之后可以用一种链式调用的方式来组织代码,让代码更加直观.而且由于 Promise.all 这样的方法存在,可以让同时执行多个操作变得简单. Promise的兴起,是因为异步方法调用中,往往会出现回调函数一环扣一环的情况.这种情况导致了回调金字塔问题的出现.不仅代码写起来费劲又不美观,而且问题复杂的时候,阅读代码的人也难以理解. 举例如下: db.save(data, function(

  • ES6中异步对象Promise用法详解

    本文实例讲述了ES6中异步对象Promise用法.分享给大家供大家参考,具体如下: 回忆一下ES5中的怎么使用异步方法 // es5中的异步回调 let ajax = function(callback){ console.log('执行') // 执行 setTimeout(() => { callback&&callback.call(); }, 1000) }; ajax(function(){ console.log('hello') // 1s后打印hello }); 使用

  • 深入解析ES6中的promise

    ES6中的promise对象很早就听说过,据说是为了解决我们使用回调产生回调地狱的问题.今天下午既然有这么想学的欲望,就来看一看吧,当然参考的还是阮一峰老师的教程. 第一部分:什么是Promise 看本文的最后一个例子,迅速理解. Promise是ES6中的一个内置的对象(实际上是一个构造函数,通过这个构造函数我们可以创建一个Promise对象),它是为了解决异步问题的.Promise的英文意思是承诺. Promise的特点如下: •Promise有三种状态:Pending(进行中).Resol

  • ES6中Promise的使用方法实例总结

    本文实例讲述了ES6中Promise的使用方法.分享给大家供大家参考,具体如下: 在javascript中,代码是单线程执行的,对于一些比较耗时的IO操作,都是通过异步回调函数来实现的. 但是这样会存在一个问题,当下一个的操作需要上一个操作的结果时,我们只能把代码嵌到上一个操作的回调函数里,这样一层嵌一层,最终形成回调地狱. $.get('/login.php', function (login) { $.get('/user.php', function (user) { $.get('/in

  • 让微信小程序支持ES6中Promise特性的方法详解

    遇到的问题 微信开发者工具更新版本后, 移除了开发者工具对 ES6 中 Promise 特性原生的支持, 理由是因为实体机器是不支持 Promise 的, 所以我们需要引入第三方的 Promise 库 微信更新日志 解决方案 下载第三方库 在这里我引入的是 Bluebird 库, 可以到Bluebird官网 下载需要的文件,也可以通过本地下载 Bluebrid 提供了两种已经构建好的完整的 Promise 库文件, 未经压缩的 bluebird.js 和已压缩的 bluebird.min.js

  • ES6中的Promise代码详解

    废话不多说了,直接给大家贴代码了,具体如下所示: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <script> var a=0 var test=function(resolve, reject){ setTimeou

  • es6中Promise 对象基本功能与用法实例分析

    本文实例讲述了es6中Promise 对象基本功能与用法.分享给大家供大家参考,具体如下: Promise 是异步编程的一种解决方案,解决--回调函数和事件 ES6 规定,Promise对象是一个构造函数,用来生成Promise实例. 下面代码创造了一个Promise实例. 基本用法 ES6 规定,Promise对象是一个构造函数,用来生成Promise实例. const promise = new Promise(function(resolve, reject) { //resolve (d

  • vue中promise的使用及异步请求数据的方法

    下面给大家介绍vue中promise的使用 promise是处理异步的利器,在之前的文章<ES6之promise>中,我详细介绍了promise的使用, 在文章<js动画实现&&回调地狱&&promise>中也提到了promise的then的链式调用, 这篇文章主要是介绍在实际项目中关于异步我遇到的一些问题以及解决方法,由此来加深对promise的进一步理解. 背景 进入商品页,商品页的左侧是分类,右侧是具体的商品,一旦进入商品页,就把所有分类的商品

随机推荐