1、Promise的理解
Promise是ES6的新语法,是JS中进行异步编程的新的解决方案,解决了回调地狱的问题
Promise对象是一个构造函数,可以创建实例对象,用来封装一个异步操作并可以获取其成功/失败的结果值
2、Promise的用法
利用关键字new创建Promise实例对象,参数是一个回调函数
回调函数有两个参数,一个是resolve,一个是reject
resolve:在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;
reject:在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去;
const p = new Promise((resolve, reject) => {
if (...) { // succeed
resolve(result);
} else { // fails
reject(error);
}
});
p.then(result=> {
console.log(result)
})
p.catch(err => {
console.log(error)
})
3、Promise的状态
Promise对象有三种状态
初始状态:pending
成功状态:fulfilled(又称resolved)
失败状态:rejected
状态的转化
初始状态pending—>成功状态fulfilled 执行resolve函数之后
初始状态pending—>失败状态rejected 执行reject函数之后
状态转化不可以逆向,也不可以进行成功状态和失败状态转化
4、promise实例的方法
1、then方法
在成功状态fulfilled下调用then方法,then方法中的参数是resolve的参数,支持链式调用,之后的then方法中的参数是上个then方法的返回值,then可以接受两个回调函数作为参数,第二个参数可选。第一个回调函数是Promise对象的状态变为fulfilled时调用,第二个回调函数是Promise对象的状态变为Rejected时调用:
p.then(result=> {
console.log(result)
}).then()
2、catch方法
在失败状态rejected下调用catch方法,catch方法中的参数是reject的参数,支持链式调用
p.catch(err => {
console.log(error)
})
3、finally方法
不管是 resolve 还是 reject 都会调用 finally 。那么相当于 fianlly 方法替使用者分别调用了一次 then 的 resolved 和 rejected 状态回调。
5、Promise的方法
1、Promise.all方法
参数:接受一个数组,数组内都是Promise实例
返回一个Promise对象
所有参数数组 Promise 实例执行 resolve 回调后,新实例执行 resolve 回调;
如果中间有任何一个 Promise 实例执行 reject 回调,那么新实例就直接执行 reject 回调了。
Promise.all = function(promises){
return new Promise(function(resolve,reject){
let done = gen(promises.length,resolve);
for(let i=0;i<promises.length;i++){
promises[i].then(function(data){
done(i,data);
},reject);
}
});
}
2、Promise.race方法
参数:接受一个数组,数组内都是Promise实例
返回一个Promise对象
返回最快完成那一个 Promise 实例。
只要参数数组中有一个 Promise 实例执行 resolve 回调或 reject 回调后,新实例就直接返回结果。
Promise.race = function(promises){
return new Promise(function(resolve,reject){
for(let i=0;i<promises.length;i++){
promises[i].then(resolve,reject);
}
});
}
3、Promise.any方法
参数:接受一个数组,数组内都是Promise实例
返回一个Promise对象
所有参数数组 Promise 实例执行 reject回调后,新实例执行 reject回调;
如果中间有任何一个 Promise 实例执行 resolve 回调,那么新实例就直接执行 resolve 回调了。
Promise.all()全部子实例都成功才算成功,有一个子实例失败就算失败。
Promise.any有一个子实例成功就算成功,全部子实例失败才算失败。
Promise.race()是赛跑机制,要看最先的promise子实例是成功还是失败。
6、promise的作用
Promise可以解决回调地狱也可以解决请求异步问题。
支持链式调用, 可以解决回调地狱问题
每次请求都依赖上一次请求返回的数据来作为参数,然后继续发出请求,层层嵌套,会形成回调地狱。
回调地狱的缺点:不便于阅读、不便于异常处理
回调地狱解决方案:promise 链式调用
终极解决方案:async/await