问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Promise的简易实现(2)

发布网友 发布时间:2023-03-14 20:31

我来回答

1个回答

热心网友 时间:2023-10-24 05:06

在上一篇文章里面,我们实现了一个简单的 Promise ,已可以满足一些较简单的场景。但却无法进行then的Promise链式衔接,比如这样:

这种场景相信用过 promise 的人都知道会有很多,那么类似这种就是所谓的 链式Promise 。

链式Promise是指在当前promise达到 fulfilled 状态后,即开始进行下一个promise(后邻promise)。那么我们如何衔接当前promise和后邻promise呢?(这是这里的难点)。

只需在then方法里面return一个promise就好啦。可见Promises/A+规范中的2.2.7
Promise/A+规范

1.then方法中,创建并返回了新的Promise实例,这是串行Promise的基础,并且支持链式调用。
2.handle方法是promise内部的方法。then方法传入的形参onFulfilled以及创建新Promise实例时传入的resolve均被push到当前promise的callbacks队列中,这是衔接当前promise和后邻promise的关键所在(这里一定要好好的分析下handle的作用)。
3.testAsyncFunc1生成的promise(简称testPromise1)异步操作成功,执行其内部方法resolve,传入的参数正是异步操作的结果123
4.调用handle方法处理callbacks队列中的回调:testAsyncFunc2 方法,生成新的promise(testAsyncFunc2 promise)
5.执行之前由testAsyncFunc1 promise的then方法生成的新promise(称为bridge promise)的resolve方法,传入参数为testAsyncFunc1 promise。这种情况下,会将该resolve方法传入testAsyncFunc2 promise的then方法中,并直接返回。
6/在testAsyncFunc2 promise异步操作成功时,执行其callbacks中的回调:testAsyncFunc1 bridge promise中的resolve方法
7.最后执行testAsyncFunc1 bridge promise的后邻promise的callbacks中的回调。

// 关键tip-2
1: 链式 promise 之间有一个桥梁 promise ,可称之为 bridge promise ,用于衔接两个 promise ,包装在 then 函数中 2: 当前一个 promise resolve 之后, bridge promise 负责传递之前 promise 的值
3: 将当前 promise 的值和 bridge promise 的 resolve 方法传给下一个 promise 之后,在下一个 promise resolve 的时候,执行 bridge promise 的 resolve 方法,再执行本身后注册的 then 函数中的 promise resolve
4: 执行完四个 promise(promise 1 - getUserId, promise 2 - getUserId bridge, promise 3 - getUserInfoById, promise 4 - getUserInfoById bridge) 之后,继续执行后面的 then 函数
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
贷款记录在征信保留几年? 安徽徽商城有限公司公司简介 安徽省徽商集团新能源股份有限公司基本情况 安徽省徽商集团有限公司经营理念 2019哈尔滨煤气费怎么有税? 快手删除的作品如何恢复 体育理念体育理念 有关体育的格言和理念 什么是体育理念 万里挑一算彩礼还是见面礼 Promise的实现 下面是一段jsp代码,简单的计算器功能,不明白的是为什么《c:set》中读取的值必须+0才能计算,不然报错 怎么制作一个JSP计算器 编写一JSP页面实现简单计算器的功能(只能用一个JSP页面来实现) 做这样的网站,后台用node.js适合吗 jquery使用(二):queue和dequeue 怎么查询具体某一天某城市的24小时空气污染物(PM2.5,PM10,SO2,NO2等)浓度 地区 南京 无锡 常州 宿迁 徐州 淮安 盐城 连云港 PM2.5日平均浓度(微克/立方米) 56 64 3 Sublime Text中如何对杂乱的代码进行格式化 python--setUp()和tearDown()应用 python 为什么本地比服务器运行要快 jqgrid设置某列靠右 addNodes 添加节点时遇到个问题,求教 敬请各位高手,前辈指点一下:下图中的那个小木屋用photoshop如何画,步骤详细点,我是初学者 哪位朋友有Photoshop例图?? html与样式表有哪些方法 函数式编程中cps(continuation-passing style )是什么意思? 动态页面ASP登陆代码 PS怎么做空间模块? 如何使用Photoshop CS3制作闪动边框 手写Promise 所有方法实现 实现Promise串行 如何手写一个Promise promise封装常用方法 js怎么实现鼠标移动出现div jQuery 表单数据存入 JSON js悬停可以计时吗 js如何控制鼠标放在div上3秒后才执行函数 js 加密解密 DW里面我做了个图片,当鼠标移动到图片上面时,会变成另一幅图片,这个效果怎么做? - 信息提示 网店装修要实现鼠标移到图片上悬停时,自动切换成另一张图片,移开又恢复之前的,这种网页特效怎么实现呢? unity3d 实现鼠标移到一张图片上时该图片切换成另一张图片,当鼠标挪开,图片变回原来的图片 MFC中,鼠标移动到一张图片上,然后显示另外一张图片 使用前端工具包bootstrap时同一页面的模态窗口是不是不能超过2个 怎样用VB编写一个倒计时程序 如何设置只要鼠标点击或移动到该导航菜单栏直接在该菜单下显示HTML网页 html点击左上角滑动出菜单(类似于安卓应用的滑动左侧出现菜单)怎样实现? HTML如何点击下拉菜单的不同选项,在网页不同的位置生成不同的图片 兼容所有浏览器的“加入收藏”怎么写呢?