网站首页 > 博客文章 正文
之前关于Promise的原理已经分享了两篇文章:
反响还不错,这一篇主要聊一下当Promise中返回一个对象时,它是怎么处理的?
两种特殊情况
Promise会对返回结果校验两种情况:
- 是否是对象或者函数,并且拥有then方法属性
- 是否又是一个Promise对象
注意:对于第一种情况中的函数,then是作为其静态方法的。因为函数也可以被当做对象,所以这种情况和返回一个普通的对象没有区别。
Promise对返回普通对象的处理
我们写一个例子(demo1)
在p1中返回了一个对象,这个对象具有一个then方法。这个是怎么执行的呢?还记得上篇文章中数据流的两个方法asap和flush吗?(不记得的话只能自己点开我上一篇文章看看吧,这里就不码字了!)
先通过asap向queue中push一个方法,在触发flush运行!这里就是直接运行普通对象的then方法,不过在运行的时候会传入两个方法参数fn1和fn2,待then方法运行得到结果,需要把这个结果传入fn1或者fn2中,在fn1和fn2中修改当前promise对象的状态和结果,然后继续执行下一个promise,本质就是多运行了thenObj.then(泛指)这样的逻辑!
Promise对返回另外一个Promise对象的处理
先看例子(demo3)
我们在p2中返回了一个新的promise对象p5,那这种怎么处理呢?
当运行完p2中then方法后,按正常逻辑接下来应该修改p2的状态和结果,但是此时发现then返回的结果是一个promise对象p5,这里又分两种情况:
- 如果p5这个promise已经运行完毕有结果了(把p5去掉then就是这种情况),那么就把p5的结果和状态同步到p2上,然后继续向下遍历其他的promise。
- 如果p5这个promise还没有运行完毕,怎么办呢?
针对上面第二种情况我们继续分析!
这里的解决方案是把p5当做parent,p2当做child!
当P1运行完毕,P2拿到了P1的运行结果和状态,P2就开始运行,但是P2运行完毕之后发现返回的是一个新的无状态的Promise,此时P2并没有急于改变自己的状态,而是把自己当做了child,把p5当做了parent,那么此时的数据流就变成了p5->p2->p3->p4(认贼作父啊),后面的运行逻辑就和之前说的一样了。
总结
以上两种情况无论写在p1中还是下面的then方法中,运行方式都是一样的。这篇文章就写到这,接下来的文章我们聊一聊Promise的几个方法!
喜欢我的文章就关注我吧,有问题可以发表评论,我们一起学习,共同成长!(收藏和转发之前,关注一下吧,你们的关注是我的动力!)
猜你喜欢
- 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)
本文暂时没有评论,来添加一个吧(●'◡'●)