Promise的几个扩展API总结

1. Promise.none

描述:

和 Promise.all 相反,当所有的promise被拒绝之后,none方法执行完成的决议,如果存在一个promise执行完成的决议,none方法则执行拒绝

code:

  Promise.none = function(promises) {return Promise.all(promises.map(promise => {return new Promise((resolve, reject) => {// Promise.all里边的所有promise实例反过来就好了return Promise.resolve(promise).then(reject, resolve)})}))}
  const promisesForNoneTest1= [Promise.reject('1'),Promise.reject('2'),Promise.resolve('3'),Promise.reject('4'),]Promise.none(promisesForNoneTest1).then(res => {debugger}, res => {debugger // 执行到此})const promisesForNoneTest2= [Promise.reject('1'),Promise.reject('2'),Promise.reject('3'),Promise.reject('4'),]Promise.none(promisesForNoneTest2).then(res => {debugger // 执行到此}, res => {debugger })

2. Promise.any

描述:

忽略被拒绝的promise,只需要有一个完成的promise,any方法就执行完成操作,如果全部的promise都被拒绝,any方法执行拒绝操作

code:

  Promise.any = function(promises) {const result = []return Promise.all(promises.map(promise => {// 控制Promise.all处理的所有的promise都执行reslove决议return Promise.resolve(promise).then(res => {// 但是只记录实际上决议为resolve的结果值result.push(res)}, () => {// 防止穿透,这里可以进行拒绝信息的返回}) })).then(() => {return new Promise((resolve, reject) => {if (result.length > 0) resolve(result)else reject(result)})})}
  const promisesForAnyTest1= [Promise.reject('1'),Promise.resolve('2'),Promise.reject('3'),Promise.resolve('4'),Promise.resolve('5'),]Promise.any(promisesForAnyTest1).then(res => {debugger // 执行到此,res 为 ['2', '4', '5']}, res => {debugger})const promisesForAnyTest2= [Promise.reject('1'),Promise.reject('2'),Promise.reject('3'),Promise.reject('4'),Promise.reject('5'),]Promise.any(promisesForAnyTest2).then(res => {debugger }, res => {debugger // 执行到此})

3. Promise.first

描述:

类似race,但是只要有一个promise决议为完成(忽略前边被拒绝的promise),就忽略后边的promise

code:

  Promise.first = function(promises) {return new Promise((resolve, reject) => {let rejectNum = 0promises.forEach(promise => {// 如果当前 promise 决议为reslove,那就直接执行"根promise"的resolve// 否则去记录到拒绝的promise中,然后判断全部的promise拒绝了,执行"根promise"的rejectPromise.resolve(promise).then(resolve, () => {if (++rejectNum === promises.length) {// 这里可以控制reject返回的信息reject()}})})})}
  const promisesForFirstTest1= [Promise.reject('1'),Promise.resolve('2'),Promise.reject('3'),Promise.resolve('4'),]Promise.first(promisesForFirstTest1).then(res => {debugger // 执行到此,res 为 '2'}, res => {debugger})const promisesForFirstTest2= [Promise.reject('1'),Promise.resolve('2'),Promise.reject('3'),Promise.resolve('4'),]Promise.first(promisesForFirstTest2).then(res => {debugger }, res => {debugger // 执行到此})

4. Promise.map

描述:

在第二个方法 any 中,用到了Promise.all的方法,里边使用Array.prototype.map方法处理了所有的的promise,当前这个Promise.map方法则希望把他俩弄到一起

Promise.map方法希望实现一个处理批量异步操作的并行迭代方法,本质上是利用Promise.all进行二次封装

code:

  Promise.map = function(promises, resolveCallback, rejectCallback) {return Promise.all(promises.map(promise => {return Promise.resolve(promise).then(result => {return resolveCallback(result)}, error => {return Promise.reject(rejectCallback(error))})}))}
  const promisesForMapTest1= [Promise.resolve('1'),Promise.resolve('2'),Promise.resolve('3'),Promise.resolve('4'),]Promise.map(promisesForMapTest1, result => {return result * 100}, result => {return result}).then(res => {debugger // 执行到此,res为 [100, 200, 300, 400]}, res => {debugger})const promisesForMapTest2= [Promise.resolve('1'),Promise.resolve('2'),Promise.reject('3'),Promise.resolve('4'),]Promise.map(promisesForMapTest2, result => {return result * 100}, result => {return result}).then(res => {debugger }, res => {debugger // 执行到此,res为 "3"})

Promise的几个扩展API总结相关推荐

  1. win10桌面和手机的扩展API,判断是否有实体后退键API

    喜大普奔的win10 uap开发预览版终于出了,这次更新跟8.1的变化不是很大,但是将原本win8.1和wp8.1uap的分项目的形式,改为了整合成一个项目,经过一次编译打包成一个appx包,实现了无 ...

  2. OpenStack 之Nova添加扩展API流程,附带资源的查找功能

    例子中涉及到SQLAlchemy 得相关操作,可以参考 上一随笔 Openstack 中规定,扩展openstack得api有两种方式 创建新的WSGI 资源 扩展原有得WSGI资源得控制器(我得理解 ...

  3. Java基础篇(02):特殊的String类,和相关扩展API

    本文源码:GitHub·点这里 || GitEE·点这里 一.String类简介 1.基础简介 字符串是一个特殊的数据类型,属于引用类型.String类在Java中使用关键字final修饰,所以这个类 ...

  4. 带你玩转kubernetes-k8s(第54篇-Kubernetes之使用API聚合机制扩展API资源)

    API聚合机制是Kubernetes 1.7版本引入的特性,能够将用户扩展的API注册到kube-apiserver上,仍然通过API Server的HTTP URL对新的API进行访问和操作.为了实 ...

  5. 恶意网站可利用浏览器扩展 API,窃取浏览器数据

    恶意网站可以利用浏览器扩展 API,在浏览器内执行代码,来窃取用户敏感信息,比如用户书签.历史浏览记录和 cookies.在这之后,攻击者可能劫持用户的登陆会话.而敏感账户像是电子邮件.社交媒体或工作 ...

  6. “plusready“: 扩展API加载完成事件

    plusready document.addEventListener("plusready", function(){// 扩展API加载完成事// 在这里边调用5+API提供的 ...

  7. 实现自定义扩展点_spring扩展API接口介绍

    对spring进行定制化功能扩展时,可以选择如下一些扩展点: BeanFactoryPostProcessor 是beanFactory后置处理器,支持在bean factory标准初始化完成后,对b ...

  8. ESP8266(mini D1)实现网络服务器Server 用到的硬件概念分析扩展 API调用总结

    0x00 项目指北 要实现网络Server要利用好8266的两个功能SPIFFS合webServer,实现效果如下 一.SPIFFS闪存系统 1.什么叫SPIFFS? SPIFFS可以拆开成两部分来理 ...

  9. ES6之Promise原理及常用的api

    前言: 1.Promise原理解析 2.后面部分讲 then,resolve与reject,all,race的操作 一.Promise原理 先看原理图: ①执行new Promise时会返回一个空状态 ...

最新文章

  1. 文本分类step by step(二)
  2. 猴子用意念玩游戏,马斯克脑机接口公司新进展
  3. 使用ffmpeg裁剪和合并视频
  4. 一个层动态放大的例子的一些知识点
  5. qrcode生产带logo_比亚迪换新标?新Logo的含义你了解吗?
  6. convert.todatetime指定日期格式_JDK1.8新增日期时间类型
  7. Spring Boot 的starter pom
  8. 安卓也是html写的么,css能判断手机是安卓还是ios吗?
  9. linux 连接redis_.NetCore 使用StackExchange.Redis 连接Redis
  10. 【房价预测】基于matlab遗传算法优化BP神经网络房价预测【含Matlab源码 592期】
  11. 优必选悟空智能机器人怎么读绘本_优必选发布悟空机器人及操作系统ROSA,关于估值这么回应…...
  12. soui 设置边框_UI神器-SOUI
  13. java+js+html 实现webSocket广播及私聊
  14. Elasticsearch 谷歌插件 Elasticsearch-head 使用
  15. 产业新基建,撬动数字经济发展新机遇
  16. matlab模拟嫦娥奔月,2017年6月英语六级翻译模拟练习题:嫦娥奔月
  17. 阿里云windows服务器配置环境以及发布项目
  18. 如何轻松地打造一款免开发RGB 三路产品?
  19. echarts迁徙效果
  20. [HNOI2012]永无乡

热门文章

  1. 通过udp及vlc传递视频流
  2. Jquery实现列表框效果
  3. vim命令杂烩(复制粘贴、建文件、撤销等)
  4. vi或vim查找替换
  5. java 配置jmstemplate_Spring JMSTemplate 与 JMS 原生API比较
  6. redis集群连接 java_Redis分布式集群和直连的Java客户端调用方式详解
  7. 获取referer中的请求参数_Servlet获取AJAX POST请求中参数以form data和request payload形式传输的方法...
  8. 计算机对口升学试题英语,对口招生考试对口升学英语模拟试卷试题.docx
  9. c语言求前15项中偶数项的和,偶数前n项和
  10. 2022年中国政企采购数字化转型白皮书