关于promise的几个认知
1. 为什么要有promise
···从代码上来说回避了回调嵌套的问题,其次promise可以保留异步请求的状态(即使得到结果不立刻执行回调,过一阵再执行仍然是可以的。)
···从思想上来说,我们设计一连串事件abc的思路是,先做a,a行的话做b,a不行做f。b行的话做c,b不行那也做f。最后c行就成功了,c不行还是做f。原始的回调函数写出来是这样的思路:a行的话做b,b行的话做c,c行的话成功,c不行做f,b不行做f,a不行做f。那么Promise显然更符合自然逻辑。
2. promise的API:http://www.tuicool.com/articles/fMJJBze
自己实现一个Promise:https://github.com/xieranmaya/blog/issues/3
(这个Promise与原生promise不同,它的resolve里直接执行了回调函数,而不是由then放进promiseJob的队列放在本轮末尾执行)
3.promise的回调为什么要在microtask中,在本轮event loop的最后执行,而不是像setTimeOut一样在下一轮event loop中执行?
我们在promise的executor中可以传入异步操作的代码(当然也可以是同步),那么就分为两种情况。
···发送异步请求--根据结果调用resolve改变promise状态--再调用回调的过程。
···执行同步代码--resolve立即执行改变了promise状态--调用回调
对于第一种情况,promise比传统方法多一步回调。异步操作的回调肯定是在macrotask中在后一个event loop中执行,试想如果promise的回调也在macrotask中,那么这个异步操作从发出请求到执行最终then方法里的回调函数,就需要耽搁两次,这当中可能会有其他任务插进来,而第二次是没必要的。所以把promise的回调放在microtask中处理,可以确保在异步返回请求后的同一轮eventloop中执行。
那么把promise注册的回调改为同步行不行呢,在异步操作里是没有问题的,因为then会在resolve执行前就注册好回调,但是对于第二种情况,如果是执行同步代码,那么resolve立即执行了,此时then方法还没有执行,没有注册上回调函数。所以不管是哪种情况,在本轮eventloop的最后执行then回调是最好的。
实际上,调用resolve或reject实际上是改变当前Promise实例的状态(pending->fulfilled,或pending-rejected),并附带传给Promise实例一个state值而已,并不是要执行其他处理。
而我们通过then来订阅Promise实例的状态变化,而这个状态变化的事件通知有3个特点:
1. 异步触发:就是状态变化后不会马上执行事件响应函数,而是等待当前任务队列为空时才执行;
2. 仅触发一次:由于Promise实例的状态变化是单向不可逆,因此同一个事件响应函数仅能被执行一次;
3. 延迟绑定:虽然我们订阅的是状态变化事件,但即使实例的状态已经为fulfilled或rejected,我们才订阅事件,依然可以得到触发。
关于promise的几个认知的更多相关文章
- 讲解JS的promise,这篇是专业认真的!
http://www.zhangxinxu.com/wordpress/2014/02/es6-javascript-promise-%E6%84%9F%E6%80%A7%E8%AE%A4%E7%9F ...
- ES6 JavaScript Promise的感性认知
http://www.zhangxinxu.com/wordpress/2014/02/es6-javascript-promise-感性认知/ 这篇文章讲的很透彻 http://www.zhangx ...
- Promise 学习笔记 - 时间支配者
本文同步自我的个人博客:http://www.52cik.com/2015/11/08/promise.html JavaScript 的 promises 事实标准称为 Promises/A+.ES ...
- Promise实践
一.概念 Promise是异步编程的解决方案之一,与事件驱动+回调函数并列. Promise是专门为异步编程设计的封闭的一次性用品,封闭体现在只有异步操作的结果能改变其状态,其他任何操作都不能改变其状 ...
- 翻新并行程序设计的认知整理版(state of the art parallel)
近几年,业内对并行和并发积累了丰富的经验.有了较深刻的理解.但之前积累的大量教材,在当今的软硬件体系下.反而都成了负面教材.所以,有必要加强宣传,翻新大家的认知. 首先.天地倒悬,结论先行:当你须要并 ...
- Promise里的代码为什么比setTimeout先执行
当浏览器或者Node拿到一段代码时首先做的就是传递给JavaScript引擎,并且要求它去执行. 然而,执行 JavaScript 并非一锤子买卖,宿主环境当遇到一些事件时,会继续把一段代码传递给 J ...
- 70行实现Promise核心源码
70行实现Promise核心源码 前言: 一直以来都是只会调用Promise的API,而且调API还是调用axios封装好的Promise,太丢人了!!!没有真正的去了解过它的原理是如何实现的,自 ...
- Javascript - Promise学习笔记
最近工作轻松了点,想起了以前总是看到的一个单词promise,于是耐心下来学习了一下. 一:Promise是什么?为什么会有这个东西? 首先说明,Promise是为了解决javascript异步编 ...
- 路由的Resolve机制(需要了解promise)
angular的resovle机制,实际上是应用了promise,在进入特定的路由之前给我们一个做预处理的机会 1.在进入这个路由之前先懒加载对应的 .js $stateProvider .state ...
随机推荐
- day21-22Redis Mahout
PS: Redis 在博客的 JavaEE PS:大数据实时执行3个特性,Storm,kafka,Redis PS:比如在系统中,1s中有大量的请求涌入的系统中,那么请求就存入数据库就挂了,这就需要到 ...
- s3c2410串口笔记
- 生产者消费者两种实现:wait/notifyAll和Lock/Condition
1.wait/notifyAll /** * 面试题:写一个固定容量同步容器,拥有put和get方法,以及getCount方法, * 能够支持2个生产者线程以及10个消费者线程的阻塞调用 * * 使用 ...
- 算法设计与分析基础 (Anany Levitin 著)
第1章 绪论 1.1 什么是算法 1.2 算法问题求解基础 1.2.1 理解问题 1.2.2 了解计算设备的性能 1.2.3 在精确解法和近似解法之间做出选择 1.2.4 算法的设计技术 1.2.5 ...
- JSON数据的优化
JSON数据的可以优化吗?肯定可以,之前都是使用XML,但之后用XML越来越少了,就是因为XML包含的冗余信息太多了.那么JSON数据有没有冗余呢? 肯定有,名称就是重复的!! 例如如下的JSON数据 ...
- win10开移动热点让手机使用上网
PC得买个无线网卡带尾部那种的,插后面,有了无线网卡能力了. 然后开启移动热点: 在设备管理器里面去,找到网络适配器,选择带有Wireless的那个,更新驱动,浏览计算机查找,从计算机的设备驱动表选取 ...
- window.onload与$(document).ready()
window.onload是原生JS事件,$(document).ready()是Jquery实现的与其作用类似的事件. 二者区别如下: 1.执行时间不同 $(document).ready()是DO ...
- jquery 实现的全选demo
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <script sr ...
- taro 最佳实践
对 JSX 支持程度补充说明: 不能在包含 JSX 元素的 map 循环中使用 if 表达式 不能使用 Array#map 之外的方法操作 JSX 数组 不能在 JSX 参数中使用匿名函数 暂不支持在 ...
- TypeScript 之 声明文件的结构
https://www.tslang.cn/docs/handbook/declaration-files/library-structures.html 模块化库 一些库只能工作在模块加载器的环境下 ...