ES6笔记(二)Promise对象
2016-07-05 15:51
399 查看
1、Promise的含义
Promise中一般封装着一个异步操作,由统一的API进行管理特点:
(1)对象状态不受外界影响
三个状态:
Pending(进行中)
Resolved(已经完成)
Rejected(已经失败)
(2)状态一旦改变,不再变
Created with Raphaël 2.1.0PromisePending(进行中)Resolved(完成)EndRejected(失败)Endyesno
优点:避免了层层嵌套的回调函数
缺点:
1、无法取消Promise
2、不设置回调,会发生内部错误,但不会反应到外部
3、Pending时,不知是刚刚开始,还是即将完成
与事件的区别:
事件: 错过,再去监听,得不到结果。
Promise: 只要状态已经改变,添加回调函数,也会立即得到这个结果
事件不断地反复发生,一般来说,使用stream模式是比部署Promise更好的选择。
2、基本用法
接口:(1)resolve,改变状态为完成
(2)reject,改变状态为失败
(3)then,指定状态变化的回调函数
then方法可以接受两个回调函数作为参数。第一个回调函数是Promise对象的状态变为Resolved时调用,第二个回调函数是Promise对象的状态变为Reject时调用
var getJSON = function(url) { var promise = new Promise(function(resolve, reject) { var client = new XMLHttpRequest(); client.open("GET", url); client.onreadystatechange = handler; client.responseType = "json" client.setRequestHeader("Accept", "application/json"); client.send(); function handler() { /* 0: 请求未初始化 1: 服务器连接已建立 2: 请求已接收 3: 请求处理中 4: 请求已完成,且响应已就绪 */ /* 200: "OK" 404: 未找到页面 */ if (this.readyState !== 4) return; if (this.status === 200) { resolve(this.response); } else reject(new Error(this.statusText)) }; }); return promise; }; getJSON("/posts.json").then(function(json) { console.log(json); }, function(error) { console.error('出错了', error); }); //第一个为resolve的回调 //第二个为reject的回调
3、catch
Promise.prototype.catch方法是.then(null, rejection)的别名,用于指定发生错误时的回调函数//写法一 var promise = new Promise(function(resolve, reject) { throw new Error("error"); }); promise.catch(function(error){ console.log("error"); }); //写法二 var promise = new Promise(function(resolve, reject) { try { throw new Error("error"); } catch(e) { reject(e); } }); promise.catch(function(error) { console.log("error"); });
需要注意:如果Promise已经resolved,则无法再捕获错误
Promise对象错误具有冒泡性质:会一直向后传递,直到被捕获,错误总会被下一个catch语句捕获
标准写法:
// good promise .then(function(data) { //cb // success }) .catch(function(err) { // error });
4、all方法
Promise.all( )用于将多个promise实例,封装成一个新的promise实例如果多个实例中,存在不是promise对象的,会调用Promise.resolve方法,转化为实例
// 生成一个Promise对象的数组 var promises = [2, 3, 5, 7, 11, 13].map(function (id) { return getJSON("/post/" + id + ".json"); }); Promise.all(promises).then(function (posts) { // ... }).catch(function(reason){ // ... });
只有六个实例的状态都为fulfilled,或者其中一个变为rejected,才会调用后面的回调函数
5、race方法
跟all方法类似,但是只要有一个实例的状态率先改变,promise的状态就随之改变6、resolve方法
将对象转化为promise对象Promise.resolve('foo') // 等价于 new Promise(resolve => resolve('foo'))
参数
(1)promise实例
依旧返回这个实例
(2)thenable对象
转化后,会立即执行这个对象的then方法
(3)根本不是对象的
返回新的promise对象,并设置状态为resolved
(4)不带参数
直接返回一个resolved状态的promise对象
7、reject
同上,只是返回的状态为resolved8、done
如果最后一个方法出现错误,无论是以then还是以
catch方法结尾,都将无法捕获。因为promise的内部错误无法冒泡到全局
解决方法:可以增加一个done方法在回调链的最后
9、finally()
不管promise最后的状态怎样,都会执行的操作10、应用
将图片写成一个promisevar img = function(Path) { return new Promise(function(resolve, reject) { var image = new Image(); image.onload = resolve; image.onerror = reject; image.src = Path; }); };
相关文章推荐
- [知其然不知其所以然-31] CLOCK_MONOTONIC and CLOCK_REALTIME
- c/c++ 管道编程
- 新手写openmp程序,结果不能运行,求教高手指点
- C中fread()函数的返回值
- DirectX 资源
- Opencv2中LUT函数操作(颜色空间缩减)
- 命名实体识别
- 关于WebService的浅显认识
- 【HDU】 2197 本原串
- opensuse linux环境下telnet源码编译安装步骤
- Problem H
- Spring MVC之@RequestMapping 详解
- LDA java
- android 圆形进度条的简单实现
- 图片转word,誓死不当打字仔
- mysql 源代码学习 博客 [lock..]
- 【oracle】 linux 下oracle 启动监听错误
- 利用CAS算法实现通用线程安全状态机
- Socket通信原理探讨(C++为例)
- C#学习笔记之正则表达式