首页 > 编程语言 >挑战1000道javascript手写题之实现Promise.all(9)

挑战1000道javascript手写题之实现Promise.all(9)

时间:2024-10-18 14:48:18浏览次数:3  
标签:resolve javascript reason Promise reject promise data 1000

Promise.all介绍

Promise.all方法接收一个数组作为参数,这个参数数组的元素也都是promise实例,该方法返回一个promise示例。

const p = Promise.all([p1, p2, p3]);

p的状态由p1、p2、p3决定,p最后的状态要么是变成fulfilled,要么变成rejected。

变成fulfilled:只有当p1、p2、p3的状态都变成fulfilled,p的状态才变成fulfilled,这时候p1、p2、p3的返回值组成一个数组,作为参数传递给p的回调函数.

变成rejected: 只要p1、p2、p3中有一个的状态变成rejected,p的状态就变成rejected,这时候第一个被reject的实例的返回值会作为参数传递给p的回调函数。

实现思路

在新建的promise实例内部遍历传递的promise数组(或者是含有迭代器的对象),为了确保输出的结果的顺序和传入的数组元素的顺序一致,需要记录遍历到的promise实例的索引,使用Promise.resolve方法对每个promise实例进行处理,如果遇到错误就直接reject出去,如果正常就将结果添加进结果数组,当成功的次数(fulfilledCount)等于数组长度时就将结果数组resolve出去。

实现

let PromiseAll = function (prams) {
  return new Promise((resolve, reject) => {
    try {
      const results = []
      let count = 0
      let fulfilledCount = 0
      for (const p of prams) {
        let i = count
        count++
        Promise.resolve(p).then((data) => {
          fulfilledCount++
          results[i] = data
          if (fulfilledCount === count) {
            resolve(results)
          }
        },reject)
      }
      if(count === 0) {
        resolve(results)
      }
    } catch (error) {
      reject(error)
    }
  }
  )
}

测试

PromiseAll([
  Promise.reject(1),
  Promise.resolve(2),
  Promise.resolve(3),
  4,
]).then(
  (data) => {
    // data:[1,2,3,4]
    // 传递[pro1,pro2,pro3,4]的话:内部默认处理Promise.resolve(4)
    console.log("成功", data);
  },
  (reason) => {
    // reason:reason2
    console.log("失败", reason);
  }
);   // 失败 1

PromiseAll([
  Promise.resolve(1),
  Promise.resolve(2),
  Promise.resolve(3),
  4,
]).then(
  (data) => {
    // data:[1,2,3,4]
    // 传递[pro1,pro2,pro3,4]的话:内部默认处理Promise.resolve(4)
    console.log("成功", data);
  },
  (reason) => {
    // reason:reason2
    console.log("失败", reason);
  }
); // 成功 [ 1, 2, 3, 4 ]

标签:resolve,javascript,reason,Promise,reject,promise,data,1000
From: https://blog.csdn.net/Ted_az/article/details/143053632

相关文章

  • [Javascript] Write Promise.all()
    Promise.myAll=function(promises){letres,rej;constp=newPromise((resolve,reject)=>{res=resolve;rej=reject;});leti=0;letresult=[];//sincePromise.allcantakeanyiterableasinput//tocheckwhether......
  • javascript渲染OFD的库
    目前使用javascript开发的OFD的渲染库主要有两个:ofd.js和liteofd,其中ofd.js开发比较早,liteofd是最近刚出现的js库。首先结论是ofd.js渲染效果没有liteofd好,因为ofd.js目前有一些效果没有支持,比如对字体没有比较好的解析和支持。liteofd相对ofd.js效果更好,并且提供的接口方法更多......
  • [Javascript] Write .call()
    Function.apply.myCall=function(ctx,...args){ctx=ctx===null||ctx===undefined?globalThis:Object(ctx);constfn=this;constkey=Sybmol("fn");//wedon'twantusercansee[Sybmol("key")]inFunctionpro......
  • 毕业设计项目-餐饮掌上设备点餐系统源码+10000字论文
    项目简介基于SSM实现的,主要功能如下:审核说明本项目源码收集于互联网或用户分享,经我们对资料的认真审核整理,确保资源可以正常使用;悉知:有一定的基础同学可以自行导入idea或者eclipse中运行项目,我们并不提供免费的技术指导。项目技术spring/springmvc/mybatis/(jsp)/html/J......
  • 毕业设计项目-基于SSM+Vue的购物商城网站的设计与实现源码+10000字论文
    项目简介基于SSM实现购物网站,主要功能如下:审核说明本项目源码收集于互联网或用户分享,经我们对资料的认真审核整理,确保资源可以正常使用;悉知:有一定的基础同学可以自行导入idea或者eclipse中运行项目,我们并不提供免费的技术指导。项目技术spring/springmvc/mybatis/(jsp)/......
  • ​Meteor:全栈JavaScript开发框架的先驱
    Meteor是一个功能强大且易用的全栈JavaScript框架,它简化了现代Web应用的开发流程,从数据库到用户界面都可以通过一套统一的技术栈来实现。无论你是构建实时应用还是想要一个快速的原型开发工具,Meteor都能为你提供完整的解决方案。本文将详细介绍Meteor的显著特性、使用方式......
  • JavaScript 数据类型转换全解析:转换为数值、字符串与布尔型
    目录非VIP用户可前往公众号“前端基地”进行免费阅读转换为数值型转换为数值型Number()函数parseInt()函数parseFloat()函数转换为字符串型转换方法toString()函数String()函数转换为布尔型转换方法Boolean()函数非VIP用户可前往公众号“前端基地”进行免......
  • JavaScript初级课程 variables
    下载node。1.申明变量variables.jsletmessage="Hello!";message="World";console.log(message);nodevariables.js2.申明不会变的变量constCOLOR_GREEN="green";console.log(COLOR_GREEN)3.数据类型DataTypes=[number,BigInt,string......
  • P10009 [集训队互测 2022] 线段树
    我们先考虑全局操作的影响。我们对每个位置考虑前面位置对它的贡献,根据差分序列的性质,当你做了\(k\)次异或差分,可以看作每次每个位置贡献给下一行的这一个位置和右侧一个位置,即\(c_{i,j}\toc_{i+1,j},c_{i+1,j+1}\),这个东西显然和杨辉三角等价,贡献方式可以视作每次向下一行......
  • JavaScript从零学起 —— 数据类型(进阶篇2)
    说明:此文章用作个人学习记录,若有任何问题或建议欢迎大家在评论区讨论文章目录前言一、Boolean(布尔值)1.定义2.实现3.用法示例4.常见问题与解决方法二、Undefined(未定义)1.定义2.实现3.常见问题与解决方法三、Null(空值)1.定义2.实现3.用法示例4.常见问题与......