【ES6】Promise对象详解

  • 一、Promise对象的含义
  • 二、Promise对象的用法
  • 三、Promise对象的几个应用【重点】
    • 1、时间延迟函数
    • 2、图片异步加载
  • 查看更多ES6教学文章:
  • 参考文献

引言:ES6新增的Generato、Promise、async都与异步编程有关。这里我们讲述Promise对象。

一、Promise对象的含义

所谓Promise就是一个对象,用来传递异步操作的消息。它代表了某个未来才会知道结果的事件(通常是一个异步操作),并且这个事件提供统一的 API,可供进一步处理。
  Promise对象有以下两个特点。
1.对象的状态不受外界影响。Promise对象代表一个异步操作,有3种状态: Pending( 进行中)、Resolved (已完成,又称Fulfilled)和Rejected (已失败)。只有异步操作的结果可以决定当前是哪种状态,任何其他操作都无法改变这个状态。这也是“Promise” 这个名字的由来,它在英语中意思就是“承诺”,表 示其他手段无法改变。
2.一旦状态改变就不会再变,任何时候都可以得到这个结果。Promise对象的状态改变只有两种可能:从Pending变为Resolved从Pending变为Rejected。只要其中之一发生, 状态就凝固了,不会再变,会一直保持这个结果。就算改变已经发生,再对Promise对象添加回调函数,也会立即得到这个结果。这与事件( Event)完全不同。事件的特点是,如果你错过了它,再去监听是得不到结果的。
  有了Promise对象,就可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。此外,Promise 对象提供统一的接口,使得控制异步操作更加容易。
  Promise也有一些缺点。首先,无法取消Promise,一旦新建它就会立即执行,无法中途取消。其次,如果不设置回调函数,Promise 内部抛出的错误不会反应到外部。再者,当处于Pending状态时,无法得知目前进展到哪一个阶段 (刚刚开始还是即将完成)。
  如果某些事件不断地反复发生,一般说来, 使用stream模式是比部署Promise更好的选择。

二、Promise对象的用法

ES6规定,Promise 对象是一个构造函数,用来生成Promise实例。下面的代码块2-1创造了一个Promise实例。

/********        代码块2-1      ********/
var promise = new Promise(function(resolve, reject) {//... some codeif (/*异步操作成功*/){resolve(value);} elsereject(error);
});

Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolve和reject。它们是两个函数,由JavaScript引擎提供,不用自己部署。   resolve函数的作用是,将Promise对象的状态从“未完成”变为“成功”(即从Pending变为Resolved),在异步操作成功时调用,并将异步操作的结果作为参数传递出去;
   reject函数的作用是,将Promise对象的状态从“未完成”变为“失败”(即从Pending变为Rejected),在异步操作失败时调用,并将异步操作报出的错误作为参数传递出去。
  Promise实例生成以后,可以用then方法分别指定Resolved 状态和Rejected状态的回调函数。见代码块2-2。

/********        代码块2-2      ********/
promise.then( function(value) {// success
}, function(value) {// failure
});

then方法可以接受两个回调函数作为参数。第一个回调函数是Promise对象的状态变为Resolved时调用,第二个回调函数是Promise 对象的状态变为Rejected 时调用。其中,第二个函数是可选的,不一定要提供。这两个函数都接受Promise对象传出的值作为参数。

三、Promise对象的几个应用【重点】

1、时间延迟函数

提出背景:我们知道setTimeout()函数可以每隔一段时间循环运行函数体。我们在编程过程中,经常会只需要循环两三次,或者在某个函数段需要停滞几秒,这时再用setTimeout就很麻烦。
  应用介绍:以下函数可延迟100ms运行。下面的代码块3-1中,timeout方法返回一个Promise实例,表示一段时间以后才会发生的结果。过 了指定的时间(ms参数)以后,Promise 实例的状态变为Resolved, 就会触发then方法绑定的回调函数。

/********        代码块3-1      ********/
function timeout(ms) {return new Promise((resolve, reject) => {setTimeout(resolve, ms, 'done');
});timeout(100). then((value) => {console. log(value);
});

2、图片异步加载

function loadImageAsync(url) {return new Promise( function(resolve, reject) {var image = new Image();image.onload = function() {resolve(image);};image.onerror = function() {reject(new Error ('Could not load image at '+url);};image.src = url;});
}

查看更多ES6教学文章:

1. 【ES6】let与const 详解
2. 【ES6】变量的解构赋值
3. 【ES6】字符串的拓展
4. 【ES6】正则表达式的拓展
5. 【ES6】数值的拓展
6. 【ES6】数组的拓展
7. 【ES6】函数的拓展
8. 【ES6】对象的拓展
9. 【ES6】JS第7种数据类型:Symbol
10. 【ES6】Proxy对象
11. 【ES6】JS的Set和Map数据结构
12. 【ES6】Generator函数详解
13. 【ES6】Promise对象详解
14. 【ES6】异步操作和async函数
15. 【ES6】JS类的用法class
16. 【ES6】Module模块详解
17. 【ES6】ES6编程规范 编程风格

参考文献

阮一峰 《ES6标准入门(第2版)》

【ES6】Promise对象详解相关推荐

  1. 【JavaScript 教程】ES6 中的 Promise对象 详解

    [JavaScript 教程]ES6 中的 Promise对象 详解 1.Promise对象含义 promise是异步编程的一种解决方法. 所谓promise,简单说是一个容器,里面保存着某个未来才会 ...

  2. JavaScript Promise对象详解

    Promise是JavaScript异步操作解决方案.介绍Promise之前,先对异步操作做一个详细介绍. JavaScript的异步执行 概述 Javascript语言的执行环境是"单线程 ...

  3. es6 Reflect对象详解

    Reflect是ES6为操作对象而提供的新API,而这个API设计的目的只要有: 将Object对象的一些属于语言内部的方法放到Reflect对象上,从Reflect上能拿到语言内部的方法.如:Obj ...

  4. 史上最全JavaScript数组对象详解(二)

    JavaScript数组对象详解(二) 上一篇博客我们讲到了JavaScript数组对象的创建,访问和属性,接下来一篇博客主要讲一下JavaScript数组对象的方法及使用.说到数组的方法,主要分为两 ...

  5. jQuery的deferred对象详解

    阮一峰大神的关于jQuery的deferred对象详解 http://www.ruanyifeng.com/blog/2011/08/a_detailed_explanation_of_jquery_ ...

  6. javascript BOM对象详解

    javascript BOM对象详解 目标:本章节将分为9点详细介绍有关BOM对象的知识点 1.什么是BOM 2.BOM的构成 3.顶级对象window 4.window对象常见事件(页面加载事件和体 ...

  7. Javascript中的Document对象详解

    Document对象详解 document 文挡对象 - JavaScript脚本语言描述           -------------------------------------------- ...

  8. 转载 雨松mono Unity获取游戏对象详解(来自我的长微博)

    Unity获取游戏对象详解(来自我的长微博) 转载 自 雨松mono 本文固定链接: http://www.xuanyusong.com/archives/2768 转载请注明: 雨松MOMO 201 ...

  9. html内置时间对象,JavaScript中的常用事件,以及内置对象详解

    原标题:JavaScript中的常用事件,以及内置对象详解 今天是刘小爱自学Java的第81天. 感谢你的观看,谢谢你. 话不多说,开始今天的学习: 学前端有一个非常权威的组织,也就是w3c,其有个专 ...

最新文章

  1. c和python区别_C语言和python的区别
  2. 从别人那拷下来的几点Session使用的经验(转载)
  3. 1095 Cars on Campus (30 分)【难 / 模拟 未完成】
  4. 二维码原理--开胃小知识
  5. Parsing error: The keyword 'const' is reservedeslint
  6. Maximal Rectangle
  7. 证监会:《证券期货业信息安全保障管理办法(征求意见稿) 》公开征求意见...
  8. Thinkphp 关联模型和试图模型区别
  9. Wpf 简单制作自己的窗体样式
  10. 第五讲 python函数
  11. iis mysql端口修改_如何处理IIS和Apache之间经常端口冲突
  12. 计算机视觉与机器视觉的区别和联系
  13. 关于实验室数据结构实验错误本周总结。引用调用bug
  14. 倍福plc有什么优点_BECKHOFF倍福安全模块的优点和缺点
  15. SpringCloud之服务网关(总体第五篇)
  16. 固定效应or随机效应?如何用matlab进行豪斯曼检验
  17. 如何禁止电脑随便修改IP?
  18. 黔南州委常委、统战部部长潘选一行领导莅临迦太利华调研
  19. 基于消息系统架构设计
  20. Java - 你如何理解AOP中的连接点(Joinpoint)、切点(Pointcut)、增强(Advice)、引介(Introduction)、织入(Weaving)、切面(Aspect)这些概念?

热门文章

  1. java SpringWeb如何实现打印日志
  2. 如何编写webService接口
  3. CentOS 7下源码编译安装新版本内核
  4. java原生类型没有封装_Java基本数据类型与封装类型详解(int和Integer区别)
  5. c语言矩阵的乘积,c语言矩阵相乘
  6. postgresql 查询序列_时间序列数据库(TSDB)初识与选择
  7. stm32l0的停止模式怎么唤醒_探索者 STM32F407 开发板资料连载第二十二章 待机唤醒实验
  8. MPB:陈同等-ImageGP在微生物组可视化中的应用
  9. QIIME 2用户文档. 9数据导入Importing data(2019.7)
  10. Nature:人类肠道微生物组的肠型