Promise
是异步编程的一种解决方案: 从语法上讲,promise是一个对象,从它可以获取异步操作的消息;从本意上讲,它是承诺,只有异步操作的结果能决定状态,并且一旦状态发生改变就一直保持不会再变。(这与事件不同,事件的特点是一旦错过,再去监听是没有结果的)
(1)创建Promise对象
Promise
对象,可以将异步操作以同步操作的流程表示,避免回调函数。此外,Promise
对象提供统一的接口,使得控制异步操作更加容易。
缺点:首先,无法取消 ,一旦新建 Promise
立即执行,无法中途取消;其次,如果不设置回调函数,Promise
内部抛出的错误,不会反应到外部;第三,当处于 Pending 状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)。
const promise = new Promise(function(resolve, reject) {
// ... some code
if (/* 异步操作成功 */){
resolve(value);
} else {
reject(error);
}
});
Promise.resolve(1).then(function(value){
console.log(value); // 打印出1
});
Promise.reject(new Error(“错了”));
then() 接受两个回调函数作为参数。当 Promise
执行的内容符合成功条件时,调用resolve
函数,失败就调用 reject
函数。其中第二个参数可以省略(catch()方法的作用),then
方法返回的是一个新的 Promise
实例,因此可以链式调用。
let promise = new Promise((resolve,reject)=>{
//做一些异步操作
setTimeout(() => {
console.log('执行完成');
resolve('我是成功!!');
}, 2000);
})
})
promise.then((data) => {
console.log(data);
})
.then((data) => {
console.log(data);
})
catch() 该方法相当于then
方法的第二个参数,指向reject
的回调函数;还有一个作用是在执行resolve
回调函数时,如果出现错误,抛出异常,不会停止运行,而是进入catch
方法中。
p.then((data) => {
console.log('resolved',data);
},(err) => {
console.log('rejected',err);
}
);
// 上下的等价
p.then((data) => {
console.log('resolved',data);
}).catch((err) => {
console.log('rejected',err);
});
all()方法可以完成并行任务, 它接收一个数组,数组的每一项都是一个 promise
对象。当数组中所有的 promise
的状态都达到 resolved
的时候,all
方法的状态就会变成 resolved
,如果有一个状态变成了 rejected
,那么 all
方法的状态就会变成 rejected
。
let promise1 = new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve(1);
},2000)
});
let promise2 = new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve(2);
},1000)
});
Promise.all([promise1,promise2]).then(res=>{
console.log(res); //[1,2]
})
race() 接受的参数也是一个每项都是 promise
的数组,当最先执行完的事件执行完之后,就直接返回该 promise
对象的值。如果第一个 promise
对象状态变成 resolved
,那自身的状态变成了resolved
;反之第一个 promise
变成 rejected
,那自身状态就会变成 rejected
。
let promise1 = new Promise((resolve,reject)=>{
setTimeout(()=>{
reject(1);
},2000)
});
let promise2 = new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve(2);
},1000)
});
Promise.race([promise1,promise2]).then(res=>{
console.log(res);
//结果:2
},rej=>{
console.log(rej)};
)
finally()方法用于指定不管 Promise 对象最后状态如何,都会执行的操作。
promise
.then(result => {···})
.catch(error => {···})
.finally(() => {···});