您的位置:首页 > 其它

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

同上,只是返回的状态为resolved

8、done

如果最后一个方法出现错误,无论是以
then
还是以
catch
方法结尾,都将无法捕获。因为promise的内部错误无法冒泡到全局

解决方法:可以增加一个done方法在回调链的最后

9、finally()

不管promise最后的状态怎样,都会执行的操作

10、应用

将图片写成一个promise

var img = function(Path) {
return new Promise(function(resolve, reject) {
var image = new Image();
image.onload = resolve;
image.onerror = reject;
image.src = Path;
});
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: