(一) Promise基础

    所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise是一个对象,从它可以获取异步操作的消息。Promise提供统一的API,各种异步操作都可以用同样的方法进行处理。

1.1-Promise对象的两个特点

(1)对象的状态不受外界影响。Promise对象代表一个异步操作,有三种状态:Pending(进行中)、Resolved(已完成,又称Fulfilled)和Rejected(已失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。这也是Promise这个名字的由来,它的英语意思就是“承诺”,表示其他手段无法改变。

(2)一旦状态改变,就不会再变,任何时候都可以得到这个结果。Promise对象的状态改变,只有两种可能:从Pending变为Resolved和从Pending变为Rejected。只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果。就算改变已经发生了,你再对Promise对象添加回调函数,也会立即得到这个结果。这与事件(Event)完全不同,事件的特点是,如果你错过了它,再去监听,是得不到结果的。

有了Promise对象,就可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。此外,Promise对象提供统一的接口,使得控制异步操作更加容易。

1.2-Promise的一些缺点

第一,无法取消Promise,一旦新建它就会立即执行,无法中途取消。

第二,如果不设置回调函数,Promise内部抛出的错误,不会反应到外部。

第三,当处于Pending状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)。

如果某些事件不断地反复发生,一般来说,使用stream模式是比部署Promise更好的选择。

1.3-Promise标准类库

Promise状态变迁图

示例分析:

以上图中定义一个Promise,其中有一个setTimeout异步方法,当超时1秒时调用函数中间的处理过程(即第三行),此时先在第六行处的p1输出如果图6,此p1的状态为pending状态。超时1S后再次输入p1状态仍然为pending状态。说明在Promise内部异步函数执行完成后状态没有改变。如下图只须在其中内部调用resolve('data')将改变p1的状态为resolved状态。

上图是没有定义then(function(data){})函数的输出,如下图可以看到定义了then()函数的输出部分,可以看到p2返回一个Promise对象且其状态是pending。从此可以看出Promise可以返回一个链式调用

1.4-关于then(onFulfilled, onRejected)的返回值与链式调用

看下图所示:在p2没有加入return语句时p2.then(function(data){})处将得到data=undefined,在加入第8行的return语句后将得到相应返回值。若在p3内的12行处console.log(p2)会得到Promise {[[PromiseStatus]]: "resolved", [[PromiseValue]]: undefined};说明p2.then()执行完成return返回后会自动修改其状态为resolved,如果return retValuePromiseValue:retValue。这样就可以实现链式方式的调用。

以上图只是返回了undefined和一个非自定义的Promise对象,以下图是返回一个自定义的Promise对象代码,在p2中又封装了一个异步回调,这种情况在实际工作很常见,当⑪行处代码不启用时,p3处的p2.then()将不会调用,因为此时的p2=p21,处于pending状态,因此无法调用⑲行处的then(),启用⑪代码后才会调用因此输出20行,21行

1.5-Promise四个模式的分析比较

如下图所示:当第⑨行处没有返回时会报错没有then()方法。启用⑨后得到的输出如下,此时测试时间为3001正是两个异步时间的总和。

参见doSomething()时序图

其他三种模式的对照输出图

http://blog.csdn.net/kingppy/article/details/50487814

http://www.tuicool.com/articles/Ivu2Ejj

http://es6.ruanyifeng.com/#docs/promise

转载于:https://www.cnblogs.com/lihuali/p/5614444.html

Promise编程基础相关推荐

  1. 剖析 Promise 之基础篇

    随着浏览器端异步操作复杂程度的日益增加,以及以 Evented I/O 为核心思想的 NodeJS 的持续火爆,Promise.Async 等异步操作封装由于解决了异步编程上面临的诸多挑战,得到了越来 ...

  2. 关于介绍编程前景的html文档,HTML编程基础稿件(32页)-原创力文档

    * * 第2章 HTML编程基础 优选文档 * 内容提要 本章首先介绍HTML的发展历史,然后介绍HTML的基本框架 详细介绍了HTML的各种常用标记:文字标记.图片标记和超级链接标记,等等. 介绍C ...

  3. QT开发(五十)——QT串口编程基础

    QT开发(五十)--QT串口编程基础 一.QtSerialPort简介 1.串口通信基础 目前使用最广泛的串口为DB9接口,适用于较近距离的通信.一般小于10米.DB9接口有9个针脚. 串口通信的主要 ...

  4. 编程基础 垃圾回收_为什么我回收编程问题

    编程基础 垃圾回收 by Amy M Haddad 通过艾米·M·哈达德(Amy M Haddad) 为什么我回收编程问题 (Why I Recycle Programming Problems) M ...

  5. Python要了解哪些编程基础 如何学Python比较好

    Python要了解哪些编程基础?如何学Python比较好?不管怎么说,Python都是大家进军IT行业值得选择的语言.毕竟它不但使用,而且还好用.更值得一提的是,它非常容易入门.而且在人工智能.传统编 ...

  6. (2)神经网络编程基础

    文章目录 神经网络编程基础 2.1 二分分类 2.2 logistic 回归(logistic Regression) 2.3 logistic 回归损失函数 损失函数 (Loss (Error)Fu ...

  7. python 舍去小数_零基础小白Python入门必看——编程基础概念

    1. 程序的构成 程序由模块组成,一个模块对应python的源文件 ,一般后缀为:.py 模块由语句构成 语句是python程序的构造单元,用于创建对象.变量赋值.调用函数.控制语句等. 2. 对象 ...

  8. linux编程取消wait函数,Linux编程基础之进程等待(wait()函数).pdf

    Linux编程基础之进程等待(wait()函数) 编程过程中,有时需要让一个进程等待另一个进程 ,最常见的是父进程等待自己的子进程 ,或者父进程回收自己 的子进程资源包括僵尸进程.这里简单介绍一下系统 ...

  9. [.net 面向对象编程基础] (18) 泛型

    [.net 面向对象编程基础] (18) 泛型 上一节我们说到了两种数据类型数组和集合,数组是指包含同一类型的多个元素,集合是指.net中提供数据存储和检索的专用类. 数组使用前需要先指定大小,并且检 ...

最新文章

  1. jquery通知插件toastr
  2. Codeforces Beta Round #14 (Div. 2) B. Young Photographer 水题
  3. 斯诺克之星 - 白沙台球杆 官方 及 派蔻台球杆 官方 www.snkstar.com - 最专业的台球杆销售网站...
  4. js如何获取div下面的input_原生 js 如何获取宽高
  5. 谷歌AMP和百度MIP,你选哪个?
  6. 生产者消费者模型(条件变量)
  7. python字符串怎么用_零基础如何使用python处理字符串?
  8. 科普帖:什么是服务网格?
  9. 遍历枚举,添加进DropDownist
  10. inl和dnl matlab_请问如何用matlab仿真它的性能, 比如 INL, DNL, SFDR,EOB等等。
  11. Xor异或是什么意思? - 已解决 - 搜搜问问
  12. 先锋linux 64位安装包的安装使用
  13. Fdfs环境搭建及整合Java
  14. 这可能是世界第一座海上漂浮城市,浑身都是黑科技!
  15. PHP-SDK实现支付宝 付款码支付、刷脸支付
  16. STM32DIY机械键盘
  17. 数据库中的锁机制(数据库中有哪些锁)
  18. 通用产品 云OA SaaS三管齐下
  19. android混淆一步一步
  20. Voronoi图(四):抛物线的妙用

热门文章

  1. bat脚本 git pull_Git遇到错误时如何解决的一些坑
  2. 如何把proe的工作目录怎么设置在服务器上的唯一方法
  3. 阿里云CentOS Linux 7安全基线检查
  4. 20165211 我期望的师生关系
  5. nRF5 SDK for Mesh(四) 源码编译
  6. mysql5.7.18-winx64安装
  7. 最常用的数据库脚本前十名
  8. Linux Virtual Server LVS Load Balancing
  9. AJAX vs FLEX:执行,传送,解析JSON,HTML,XML,AFM格式效率比较.
  10. Django登录界面