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的几个认知的更多相关文章

  1. 讲解JS的promise,这篇是专业认真的!

    http://www.zhangxinxu.com/wordpress/2014/02/es6-javascript-promise-%E6%84%9F%E6%80%A7%E8%AE%A4%E7%9F ...

  2. ES6 JavaScript Promise的感性认知

    http://www.zhangxinxu.com/wordpress/2014/02/es6-javascript-promise-感性认知/ 这篇文章讲的很透彻 http://www.zhangx ...

  3. Promise 学习笔记 - 时间支配者

    本文同步自我的个人博客:http://www.52cik.com/2015/11/08/promise.html JavaScript 的 promises 事实标准称为 Promises/A+.ES ...

  4. Promise实践

    一.概念 Promise是异步编程的解决方案之一,与事件驱动+回调函数并列. Promise是专门为异步编程设计的封闭的一次性用品,封闭体现在只有异步操作的结果能改变其状态,其他任何操作都不能改变其状 ...

  5. 翻新并行程序设计的认知整理版(state of the art parallel)

    近几年,业内对并行和并发积累了丰富的经验.有了较深刻的理解.但之前积累的大量教材,在当今的软硬件体系下.反而都成了负面教材.所以,有必要加强宣传,翻新大家的认知. 首先.天地倒悬,结论先行:当你须要并 ...

  6. Promise里的代码为什么比setTimeout先执行

    当浏览器或者Node拿到一段代码时首先做的就是传递给JavaScript引擎,并且要求它去执行. 然而,执行 JavaScript 并非一锤子买卖,宿主环境当遇到一些事件时,会继续把一段代码传递给 J ...

  7. 70行实现Promise核心源码

    70行实现Promise核心源码 前言: ​ 一直以来都是只会调用Promise的API,而且调API还是调用axios封装好的Promise,太丢人了!!!没有真正的去了解过它的原理是如何实现的,自 ...

  8. Javascript - Promise学习笔记

    最近工作轻松了点,想起了以前总是看到的一个单词promise,于是耐心下来学习了一下.   一:Promise是什么?为什么会有这个东西? 首先说明,Promise是为了解决javascript异步编 ...

  9. 路由的Resolve机制(需要了解promise)

    angular的resovle机制,实际上是应用了promise,在进入特定的路由之前给我们一个做预处理的机会 1.在进入这个路由之前先懒加载对应的 .js $stateProvider .state ...

随机推荐

  1. Java基础五(方法)

    今日内容介绍1.方法基础知识2.方法高级内容3.方法案例 ###01方法的概述 * A: 为什么要有方法 * 提高代码的复用性 * B: 什么是方法 * 完成特定功能的代码块. ###02方法的定义格 ...

  2. linux杀死进程方法

    方法一: 根据pid ps -aux|grep 你的进程 方法二: 删除pid文件 [root@localhost ~]# /etc/init.d/redis_6380 start /var/run/ ...

  3. 非系统服务如何随系统启动时自动启动(rc.local加了可执行权限,仍然没有生效)

    我们知道,例如我们直接yum 安装的httpd mysqld之类的服务可以直接systemctl enable mysql使服务自动启动,但是,我们应该关心的是但是的那部分 例如nginx,我的话,我 ...

  4. sudo权限的设置

    什么是sudo,为什么要sudo呢?就我个人愚见普通用户sudo之后拥有root用户的所有权限,其优点在于,虽然该用户拥有root权限,但他却不需要知道root用户密码,需要输入的是他本身的密码. 那 ...

  5. apache kafka系列之在zookeeper中存储结构

    1.topic注册信息 /brokers/topics/[topic] : 存储某个topic的partitions所有分配信息 Schema:   {    "version": ...

  6. Day 03 基本数据类型

    一.基本数据类型的使用 1.为何区分数据类型? 答:数据类型指的是变量值的类型,变量值之所以区分类型,是因为变量值用来记录事物状态的,而事物的状态有不同的种类,对应着也必须使用不同类型的值去记录. 整 ...

  7. ASP.NET AJAX入门系列(7):使用客户端脚本对UpdateProgress编程

    在本篇文章中,我们将通过编写JavaScript来使用客户端行为扩展UpdateProgress控件,客户端代码将使用ASP.NET AJAX Library中的PageRequestManager, ...

  8. Keras/Tensorflow训练逻辑研究

    Keras是什么,以及相关的基础知识,这里就不做详细介绍,请参考Keras学习站点http://keras-cn.readthedocs.io/en/latest/ Tensorflow作为backe ...

  9. msp430学习笔记-实现开方log等计算及FFT算法(待续)

    MSP430 FFT算法实现 http://bbs.21ic.com/icview-391532-1-1.html http://blog.sina.com.cn/s/blog_6cd2030b010 ...

  10. RichEdit选中文字右键菜单的实现

    procedure TForm1.RichEdit1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: ...