1.简介
Promise是抽象异步处理对象以及对其进行各种操作的组件。
2.对象状态
Promise对象有2种状态:
-
promise对象被 resolve 时的处理(onFulfilled)
-
promise对象被 reject 时的处理(onRejected)
3.创建Promise对象
创建一个Promise对象一般分为2步:
a.new Promise(function(resolve,reject){
//业务逻辑
//处理结果正确就调用resolve方法
//处理逻辑错误叫调用reject方法
})
b.调用Promise实例的then()、catch()方法,异步处理完成就执行then方法,处理异常就执行catch方法。
function aysncTest(){
return new Promise(function (resolve, reject) {
setTimeout(function () {
resolve('Async Hello world');
}, 16);
})
}
aysncTest().then(function (value) {
console.log(value); // => 'Async Hello world'
}).catch(function (error) {
console.log(error);
})
4.Promise方法
4.1实例方法
then(fn):该方法是用来注册Promise实例的状态为onFulfilled时的回调函数。
catch(fn):该方法是用来注册Promise实例的状态为onRejected时的回调函数,它其实是promise.then(undefind,onRejected)的另一种写法而已。
Pormise对象支持链式写法,在链式写法中每个then的执行都是同步,不是链式写法则then的执行是异步的。
var promise = new Promise(function (resolve){
console.log("inner promise"); // 1
resolve(42);
});
promise.then(function(value){
console.log(value); // 2
}).then(function(value="outer promise" ){
console.log(value); // 3
return value;
}).catch(function(error){
console.log(error); // 3
return error;
}).then(function(value){
console.log(value); // 4
});
//执行结果:
//inner promise
//42
//outer promise
//outer promise
注意:then和catch返回的都是一个全新的Promise对象,在执行这两个方法后,不论返回的数据类型是什么,都会被包装成一个全新的Promise对象。返回的数据会传递到下一个链式方法里作为参数。
4.2静态方法
Promise.resolve(value):使promise对象立即进入onResolved状态,并且将value参数传给then方法。相当于如下代码:
new Promise(function (resolve){
resolve(value);
});
resolve方法还能将thenable(具有then方法的对象)转换为Promise对象,但是需要注意的是:两个对象的then必须有同样的机制和处理流程,否则会导致部分信息丢失,
例如:jQuery.ajax()的返回值就具有then方法,但是2者机制不同,强转的话就会导致部分信息不完整。
Promise.reject(error):使promise对象立即进入onRejected状态,并且将error参数传给catch方法。相当于如下代码:
new Promise(function(resolve,reject){
reject(error);
});
Promise.all(array):接收一个 promise对象的数组作为参数,当这个数组里的所有promise对象全部变为resolve或reject状态的时候,它才会去调用 .then 方法。
var promise1 = new Promise(function (resolve){
resolve("promise1 is resolve");
});
var promise2 = new Promise(function (resolve){
resolve("promise2 is resolve");
});
function main(){
return Promise.all([promise1,promise2])
}
main().then(function(value){
console.log(value)
})
//执行结果:
//["promise1 is resolve", "promise2 is resolve"]
Promise.race(array): 接收一个 promise对象的数组作为参数,当这个数组里只要有一个promise对象进入reject状态的时候,它才会去调用 .then 方法。
// `delay`毫秒后执行resolve
function timerPromisefy(delay) {
return new Promise(function (resolve) {
setTimeout(function () {
resolve(delay);
}, delay);
});
}
// 任何一个promise变为resolve或reject 的话程序就停止运行
Promise.race([
timerPromisefy(1),
timerPromisefy(32),
timerPromisefy(64),
timerPromisefy(128)
]).then(function (value) {
console.log(value); // => 1
});