一,概念
promise是异步编程的一种解决方案,他利用了柯里化函数的原理实现了链式调用,他可以让我们写起来像写同步代码一样,不必一层层的嵌套回调函数,就是所谓的回调地狱问题。
二,特点
1,他有三种状态:进行中pending、成功fulfilled--调用resolve、失败rejected--调用reject
2,他的状态不受外界影响,一旦发生变化,就不会再次改变
3,创建promise对象时必须传入一个函数,不然会报错
4,函数的参数是resolve(成功时调用)和reject(失败时调用)两个回调函数
5,他一旦被新建,就会立即执行,无法中途取消。
6,用then监听执行结果
7,then方法每次执行完都会返回一个新的promise对象
三,使用示例
const add = new Promise((resolve, reject) => {
if (xxx) { // 成功
resolve();
} else { // 失败
reject();
}
});
add().then((res) => {
// 成功resolve的回调
}).then((err) => {
// 失败reject的回调,可省略
});
说明:因为catch是then的语法糖,因此常用的使用方法是promise().then() + catch(),通常不会写reject的then方法。
四,其他重要用法
catch() - catch方法是then方法的语法糖,用于指定then中发生错误时,直接在catch中捕获
finally() - 无论执行还是失败,最后都一定会执行的方法(ES2018引入)
Primise.all([p1, ...pN]) - 参数为一个promise对象的数组,该方法是并行执行多个promise任务,所有数组中promise任务都执行完之后,再执行then方法。
结果:所有任务都成功resolve,最终的结果才是成功resolve;如果有一个执行失败(reject),则最后的结果就是失败(reject)
Promise.race(p1, ...pN) - 赛跑,与all方法类似,不同的是,他的promise数组中的所有promise任务以最快一个执行完的为准。
结果:如果指定时间内,第一个执行完的promise任务结果为成功resolve,则最后的结果就是成功;如果超过指定时间,还是没有任何任务执行完,那最终的结果就是失败reject
多个异步串行的任务 - 可以通过then方法进行多个链式调用,其中任何一个任务失败都会执行catch处理错误。
function add(val){
return new Promise((resolve, reject) => {
resolve(val++);
});
}
function minus() {
return new Promise((resolve, reject) => {
resolve(val--);
});
}
function p() {
return new Promise((resolve, reject) => {
resolve(1);
});
}
p.then(add)
.then(add)
.then(minus)
.catch((err) => {
console.log(err)
})