ES6-Promise
[TOC]
本文用来记录一下学习ES6的promise对象,方便用的时候直接找到。
-promise含义
- promise基本用法
- promise基本用法实例
- promise API
promise含义
ES6原生提供了promise对象,该对象就是一容器,内部包含有未来某个时间结束的动作。
promise基本用法
ES6 规定,Promise对象是一个构造函数,用来生成Promise实例。
如下实例:
var promise = new Promise(function(resolve, reject) {
// ... some code
if (/* 异步操作成功 */){
resolve(value);
} else {
reject(error);
}
});
Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolve和reject。它们是两个函数,由 JavaScript 引擎提供,不用自己部署。resolve表示promise的状态的成功,reject表示promise的状态的失败。
promise实例生成之后可以调用then方法,传入promise对象的两个回调函数,其中第二个是非必须的。
如下:
promise.then(function(value) {
// success
}, function(error) {
// failure
});
promise基本用法实例
promise基本用法实例 封装:
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() {
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('Contents: ' + json);
}, function (error) {
console.error('出错了', error);
});
promise API
promise当然有自己的api,简单介绍一下个人常用的API:
1. Promise.prototype.then() //之前已经介绍,不再详解
2. Promise.prototype.catch() //该方法可用来接收reject参数,同时也可以用来捕获Promise中的error,故推荐用catch来写。
:如下:
getJSON("/posts.json").then(function (json) {
console.log('Contents: ' + json);
}).catch(function (error) {
console.error('出错了', error);
});
- Promise.all() //该方法可用于进行同步操作,将多个Promise对象包装成一个Promise对象,所有Promise对象全部resolve才出发resolve,有一个reject,则reject,可以想象为&&操作符的逻辑。
如下:
// 生成一个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){
// ...
});
- done()
处于整个Promise链的最后,用来捕获错误,可像then一样来使用。
asyncFunc()
.then(f1)
.catch(r1)
.then(f2)
.done();
- finally()
类似Java的try…catch…finally,无论如何最后都会执行的,与done的区别在于可传入普通函数。