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. 尚硅谷【SpringBoot】入门

    https://www.bilibili.com/video/av20965295/?p=2 缺点: 基于springframe的封装    对framework api需要熟悉 2微服务 2014 ...

  2. MySQL--Checkpoint基础

    ===================================================== Checkpint 分两种:Sharp Checkpoint : 在服务器正常关闭时,将所有 ...

  3. What are long running processes?

    转自:https://blog.bernd-ruecker.com/what-are-long-running-processes-b3ee769f0a27 Some communities have ...

  4. thinkphp5 查询的数据是对象时,获取原始数据方法

    获取原始数据 如果你定义了获取器的情况下,希望获取数据表中的原始数据,可以使用: $user = User::get(1); // 通过获取器获取字段 echo $user->status; / ...

  5. TP5模型belongsTo和hasOne的区别

    在使用tp5模型的ORM的时候出现belongsTo和hasOne都有表示一对一的关系,但是二者并不相同.以下举例说明两者的区别: 首先有user表 字段 id name password字段 然后有 ...

  6. pip查看已安装包列表

    输入命令: pip freeze 结果: certifi==2018.10.15chardet==3.0.4Django==2.1.2idna==2.7pytz==2018.5requests==2. ...

  7. Jenkins 安装启动提示“iJob for jenkins.service failed because the control process exited with error code. See "systemctl status jenkins.service" and "journalctl -xe" for details.”

    通过RPM安装Jenkins简单方便,不太需要复杂的过程,但是在安装完成以后启动Jenkins的时候提示“Starting jenkins (via systemctl): Job for jenki ...

  8. 深入理解ASP.NET MVC(8)

    系列目录 过滤器上下文参数 前一节提到了四种MVC内建过滤器,它们无一例外都在关键的方法中提供了叫filterContext的参数,尽管它们各自类型不同,但是都继承自ControllerContext ...

  9. file命令详解

    Linux file命令 Linux file命令用于辨识文件类型. 通过file指令,我们得以辨识该文件的类型 用法: file [-bchikLNnprsvz0] [--apple] [--mim ...

  10. 安装plsql developer

    需求:要连接oracle数据库,不想在本地安装oracle,太大,又占内存,所以用plsql developer.. 在网上看了很多博客,妈呀,被毒的不清,一直提示初始化失败,就是那个oci,dll ...