当前位置: 首页 > wzjs >正文

首饰设计网站大全网站建设子栏目文案

首饰设计网站大全,网站建设子栏目文案,昆明市建设局官方网站,长沙微信乘车码在哪里前言 之前在看远方os大佬直播的时候看到有让手写的Promise.all的问题,然后心血来潮自己准备手写一个 开始 首先,我们需要明确原本js提供的Promise.all的特性 Promise.all返回的是一个Promise如果传入的数据中有一个reject即整个all返回的就是reject&…

前言

之前在看远方os大佬直播的时候看到有让手写的Promise.all的问题,然后心血来潮自己准备手写一个

开始

首先,我们需要明确原本js提供的Promise.all的特性

  1. Promise.all返回的是一个Promise
  2. 如果传入的数据中有一个reject即整个all返回的就是reject,且是第一个reject的数据
  3. 如果传入的不是Promise,all会自动用Promise.reslove将其解析成Promise完成状态(重要)
  4. all的函数不一定非要是数组
    那我们用Promise验证一下吧
    image
    image
    image
    以上就是all主要的几个特性了,还有特性后面详细描述

编写代码

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title></head><body><script>Promise.myAll = (data) => {return new Promise((resolve, reject) => {let result = [];let count = 0;const promises = Array.from(data);if (promises.length === 0) {return resolve(result); // 空迭代对象直接 resolve}for (let i = 0; i < promises.length; i++) {Promise.resolve(promises[i]).then((res) => {result[i] = res;count++;if (count === data.length) {resolve(result);}}).catch((err) => {reject(err);});}});};const a = new Promise((resolve) => {setTimeout(() => {resolve(1000);}, 1000);});const b = new Promise((resolve) => {setTimeout(() => {resolve(2000);}, 2000);});const self = "自定义all";Promise.myAll([b, a]).then((res) => {console.log(res, self);});Promise.all([b, a]).then((res) => {console.log(res, "js的all");});Promise.myAll("abc").then((res) => {console.log(res, self);});Promise.all("abc").then((res) => {console.log(res, "js的all");});</script></body>
</html>

我们先看一下执行结果
image
结果是没有问题的,那我们解释一下代码
const promises = Array.from(data); 将数据转成数组,没什么好说的,重点是循环

   for (let i = 0; i < promises.length; i++) {Promise.resolve(promises[i]).then((res) => {result[i] = res;count++;if (count === data.length) {resolve(result);}}).catch((err) => {reject(err);});}

为什么 result[i] = res; count++; if (count === data.length) { resolve(result); } 这样写而不是result.push(res),且比较长度为什么不用i,
解释:其实我们看给的案例中b,a就清楚了,因为Promise.all返回的结果不是执行的顺序,而是你传入的顺序,即不论a的执行结果多快,b的执行多慢,只要传入的是[b,a],那么返回结果一定是b的结果在前面,如果使用result.push(res),那么如果b比a慢,就会使a的结果在第一项,b在第二项,因为a先执行完的;
那为什么比较长度不用i呢,我们在for循环打印一下i

  for (let i = 0; i < promises.length; i++) {Promise.resolve(promises[i]).then((res) => {console.log(i);result[i] = res;count++;if (count === data.length) {resolve(result);}}).catch((err) => {reject(err);});}

发现结果i是1 0
image
那如果用i判断,b根本就不会在返回结果里面,所以需要使用额外数据来判断

继续完善代码

这就结束了吗?其实已经算是差不多结束了,但是有一个比较特殊的数据,对象呢,Promise.all如果参数传入的是对象结果是什么呢,那我们调用一下看下吧
image
发现,直接报错了,如果有了解过Symbol.iterator的小伙伴一下子就知道了,对象是没有Symbol.iterator这个方法的,而Promise.all传入的参数必须要有Symbol.iterator方法,字符串,数组 Set和Map是有这个方法的,但是对象没有,所以直接报错;
至于Symbol.iterator方法详解可以看一下我在csdn发布的文章js对象for…of循环,这里就不多做介绍了

那我们把代码完善一下

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title></head><body><script>Promise.myAll = (data) => {return new Promise((resolve, reject) => {if (data === null || !data[Symbol.iterator]) {reject("错误,无法迭代");return;}let result = [];let count = 0;const promises = Array.from(data);if (promises.length === 0) {return resolve(result); // 空迭代对象直接 resolve}for (let i = 0; i < promises.length; i++) {Promise.resolve(promises[i]).then((res) => {console.log(i);result[i] = res;count++;if (count === data.length) {resolve(result);}}).catch((err) => {reject(err);});}});};const a = new Promise((resolve) => {setTimeout(() => {resolve(1000);}, 1000);});const b = new Promise((resolve) => {setTimeout(() => {resolve(2000);}, 2000);});const self = "自定义all";Promise.myAll([b, a]).then((res) => {console.log(res, self);});Promise.all([b, a]).then((res) => {console.log(res, "js的all");});Promise.myAll("abc").then((res) => {console.log(res, self);});Promise.all("abc").then((res) => {console.log(res, "js的all");});Promise.myAll({}).then((res) => {console.log(res, self);});</script></body>
</html>

Promise.all是直接抛出异常的,我们这里就不抛出异常了
image
结果也是正常的;
那有人就提出了,如果我在对象原型添加了Symbol.iterator这个方法是不是也会正常执行then方法呢,在Promise.all中,如果对象提供了Symbol.iterator他也是可以正常执行不抛出异常的,这个就留个大家自己去实现一下把

总结

以上就是实现Promise.all的一些代码,一开始以为比较简单,但其实真正写起来还是有很多需要注意点的,主要是for循环那一段逻辑,很容易出问题
彩蛋:
image
我自己写完之后给远佬看过,来自远佬的高度评价,哈哈
至于他说的问题其实就是当时for循环添加结果用的是push方法
tips: 远佬可是vue的官方团队成员


文章转载自:

http://SxRWwi5V.nynyj.cn
http://piYd9CR8.nynyj.cn
http://IOUwihlf.nynyj.cn
http://3rqC2cPQ.nynyj.cn
http://htE10VrH.nynyj.cn
http://NEmWt9wp.nynyj.cn
http://bDU0QZdh.nynyj.cn
http://3zEFx5Gh.nynyj.cn
http://hwyFFjUy.nynyj.cn
http://6JWROQzf.nynyj.cn
http://iabQKCAT.nynyj.cn
http://v317FtaQ.nynyj.cn
http://nyleVWz3.nynyj.cn
http://JtGnzecz.nynyj.cn
http://9kFtUIyY.nynyj.cn
http://WHK6WnEI.nynyj.cn
http://Zs9LCMpA.nynyj.cn
http://pdewhrrW.nynyj.cn
http://7XnPcTxJ.nynyj.cn
http://46ejdO3r.nynyj.cn
http://Ve5RwlFV.nynyj.cn
http://dbnrIvms.nynyj.cn
http://ysTjRLJT.nynyj.cn
http://UXlYdoJk.nynyj.cn
http://A9j8stBS.nynyj.cn
http://4PfQG61J.nynyj.cn
http://a5I47CQk.nynyj.cn
http://Xz7Iuc1D.nynyj.cn
http://YPj5U4A1.nynyj.cn
http://ATrhUx18.nynyj.cn
http://www.dtcms.com/wzjs/731543.html

相关文章:

  • dedecms网站邮件程序罗源做网站的公司
  • 公司网站建设情况说明建设购物网站的目的
  • 泉州网站建设培训机构互联网技术类岗位有哪些
  • 如何给网站流量来源做标记通过在网址后边加问号?网站建设框架文案
  • 湖北省建设工程人力资源网站河北手机网站制作价格
  • 网站建设 python焦作建设银行网站
  • 网站 未备案 支付宝枣庄住房和城乡建设厅网站
  • 做外贸建网站需要推广吗设计网站免费大全
  • 百度不收录我的网站郑州网约车从业资格证报名
  • 在腾讯云怎样建设网站陕西省建设厅特种工报名网站
  • 英文wordpress变中文seo点石论坛
  • 电工培训机构网络优化首先要有网站
  • 天津电商网站开发yahoo搜索引擎提交入口
  • 哪个在家做兼职网站比较好深圳做购物网站
  • 互联网网站建设情况统计表网页设计教程博主
  • 唐山高端网站建设公司开发一个软件需要什么过程
  • 做游戏代练网站展览公司
  • 凡科网怎么修改网站电子商务网站登录
  • 网站怎么做404页面网页翻译失败
  • 营销网站费用好看的网站建设公司
  • 大型外贸网站建设沈阳专业seo排名优化公司
  • 效益型网站山西山西省建设厅网站首页
  • js代码网站大全上海网站开发外包
  • ui设计和网站建设人员李伟宁建网站到底需要多少钱
  • 购物网站 服务器 带宽 多大中国城乡与住房建设部网站
  • 帮客户做传销网站邯郸哪里制作网站
  • 网站先做前端还是后端域名申请网站
  • 只做财经的网站海外网站建设公司
  • 端州网站建设公司wordpress伪静态301错误
  • 当年的51网站wordpress表格内容如何修改