网站首页 > 博客文章 正文
在上一篇前端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处理过程中的几种特殊情况!
喜欢我的文章就关注我吧,有问题可以发表评论,我们一起学习,共同成长!(别只顾着收藏和转发,关注一下吧,你们的关注是我的动力!)
- 上一篇: 53.关于es6的Promise(es6常用)
- 下一篇: 尚硅谷_前端工程化(尚硅谷百科)
猜你喜欢
- 2024-10-27 前端面试大全:手写 Promise(前端手机端面试题)
- 2024-10-27 Javascript ES6中 Generator的?async/await Promise 了解一下?
- 2024-10-27 Promise 中 race 方法的目的是什么
- 2024-10-27 ES6 Promise对象(es6对象操作)
- 2024-10-27 ES6 Promise 的最佳实践(es6 promise作用)
- 2024-10-27 ES6学习(17):彻底搞懂 async 和 await,轻松掌握异步编程!
- 2024-10-27 自己造轮子,超详细、简单的Promise对象原理讲解及代码实现
- 2024-10-27 JavaScript ES6 语法特性介绍(javascript的基本语法遵循的标准是____。)
- 2024-10-27 图解 Promise 实现原理(一):基础实现
- 2024-10-27 可视化的 js:动态图演示 Promises & Async/Await 的过程
你 发表评论:
欢迎- 06-23MySQL合集-mysql5.7及mysql8的一些特性
- 06-23MySQL CREATE TABLE 简单设计模板交流
- 06-23MYSQL表设计规范(mysql设计表注意事项)
- 06-23MySQL数据库入门(四)数据类型简介
- 06-23数据丢失?别慌!MySQL备份恢复攻略
- 06-23MySQL设计规范(mysql 设计)
- 06-23MySQL数据实时增量同步到Elasticsearch
- 06-23MySQL 避坑指南之隐式数据类型转换
- 最近发表
- 标签列表
-
- powershellfor (55)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- vue数组concat (56)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)