网站首页 > 技术文章 正文
在上一篇前端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模块化知识点总结
你 发表评论:
欢迎- 612℃几个Oracle空值处理函数 oracle处理null值的函数
- 603℃Oracle分析函数之Lag和Lead()使用
- 592℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 589℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 583℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 576℃【数据统计分析】详解Oracle分组函数之CUBE
- 566℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 558℃Oracle有哪些常见的函数? oracle中常用的函数
- 最近发表
-
- PageHelper - 最方便的 MyBatis 分页插件
- 面试二:pagehelper是怎么实现分页的,
- MyBatis如何实现分页查询?(mybatis-plus分页查询)
- SpringBoot 各种分页查询方式详解(全网最全)
- 如何在Linux上运行exe文件,怎么用linux运行windows软件
- 快速了解hive(快速了解美国50个州)
- Python 中的 pyodbc 库(pydbclib)
- Linux搭建Weblogic集群(linux weblogic部署项目步骤)
- 「DM专栏」DMDSC共享集群之部署(一)——共享存储配置
- 故障分析 | MySQL 派生表优化(mysql pipe)
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- 前端获取当前时间 (50)
- Oracle RAC (76)
- oracle恢复 (77)
- oracle 删除表 (52)
- oracle 用户名 (80)
- oracle 工具 (55)
- oracle 内存 (55)
- oracle 导出表 (62)
- oracle约束 (54)
- oracle 中文 (51)
- oracle链接 (54)
- oracle的函数 (58)
- 前端调试 (52)
本文暂时没有评论,来添加一个吧(●'◡'●)