网站首页 > 技术文章 正文
在上一篇前端ES6中Promise的运行原理的讲解中其实有很多细节方面没有提及到,这篇我们讨论更细致一点。
回顾上一篇重点
这个图就代表上一篇说到的链式调用,而链式调用的开关就是Promise里面的resolve方法。
一种数据流的实现方式
在js中有很多种形式的数据流,比如常用的事件回调、express中的next方法,类似于koa的洋葱皮,包括Promise本身也是一种数据流形式!Promise内部实现了一种数据流来支撑Promise的运转。
首先我们来看一个遍历函数flush,很容易看出来它的遍历速度是2,因为每一次的遍历都需要从queue数组中拿出一个方法callback和一个参数arg,然后把他们放在一起执行,但是它们又怎么形成一个数据流的呢?关键就在于这个len,queue 和这个callback。
- 首先向queue中push一对callback和arg,此时len==2
- 这是flush中的遍历就能运行起来,开始遍历,从queue中取出callback和arg,开始执行callback(arg)
- 在执行callback的过程中,又向queue中push一个callback和一个arg,此时len变成了4
- 那么flush中的for循环在遍历一遍后本来是要终止的,但是callback把len变成了4,又可以继续往下遍历queue
- 依次类推,就实现了一个数据流
向queue中添加数据的操作可以处理成一个单独的方法asap
可以看出来,asap只是在第一次触发了flush,后面就可以像流水一样自己能自行流动。这个async方法名是我编造的,不要把它理解为保留字,只是为了便于理解,代表一个异步的方法,它可能的值有下面几个:
- setTimeout
- process.nextTick
- MutationObserver
- vertxNext
- MessageChannel
- 自定义
这些都有可能,完全看运行环境的兼容性如何。
数据流运用到Promise中
我们先看一下上一篇中的一个demo
p1的运行是同步完成的,所以p2可以直接拿到p1的状态和结果,那么我们结合上一篇文章重构一下then方法。
拿到上一个promise状态的then可以直接通过asap去触发flush,这里定义了一个invokeCallback方法,猜测一下它里面做了什么?其实很简单:
在flush中运行了invokeCallback,修改child的状态和结果,child又会继续运行下一个promise对象。上图中的红色区域中的代码可以提取出来,再通过asap传入queue中通过flush执行。
还有一个问题:不是每个then都能同步拿到上一个Promise的状态和结果,那这种情况下就是我们之前说的把child挂在到parent上,等待上面的promise状态修改完成会自动遍历到下面的child,重构一下then方法:
总结
说到这里,promise数据流的形成过程已经说的差不多了!下一篇我们再研究一下promise处理过程中的几种特殊情况!
喜欢我的文章就关注我吧,有问题可以发表评论,我们一起学习,共同成长!(别只顾着收藏和转发,关注一下吧,你们的关注是我的动力!)
- 上一篇: 写给前端的你:ES6模块化知识点总结
- 下一篇: 前端ES6数组方法总结
猜你喜欢
- 2025-05-26 ES6字符串的新特性及新增方法梳理
- 2025-05-26 ES6新增语法(七)——async...await
- 2024-09-24 前端ES6中Promise的运行原理
- 2024-09-24 「ES6基础」Object的新方法
- 2024-09-24 「ES6基础」const的用法
- 2024-09-24 「ES6基础」箭头函数(Arrow functions)
- 2024-09-24 前端关于ES6的面试题汇总含答案
- 2024-09-24 前端系列——ES6中的数据结构map和set
- 2024-09-24 前端ES6数组方法总结
- 2024-09-24 写给前端的你:ES6模块化知识点总结
你 发表评论:
欢迎- 05-30为什么说网上的md5加密解密站都是通过彩虹表解密的?
- 05-30一文读懂md5,md5有什么用,什么是md5加盐
- 05-30Java md5加密解密数据
- 05-30MD5是什么?如何进行MD5校验?
- 05-30专家教你简单又轻松的MD5解密方法,一看就会
- 05-30多学习才能多赚钱之:vscode怎么安装插件
- 05-30VSCode无限画布模式(可能会惊艳到你的一个小功能)
- 05-30VSCode神级Ai插件Cline:从安装到实战【创建微信小程序扫雷】
- 最近发表
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端react (48)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (55)
- 前端数组 (65)
- 前端定时器 (47)
- Oracle RAC (73)
- oracle恢复 (76)
- oracle 删除表 (48)
- oracle 用户名 (74)
- oracle 工具 (55)
- oracle 内存 (50)
- oracle 导出表 (57)
- oracle 中文 (51)
- oracle链接 (47)
- oracle的函数 (57)
- mac oracle (47)
- 前端调试 (52)
- 前端登录页面 (48)
本文暂时没有评论,来添加一个吧(●'◡'●)