promise
Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理且更强大。它最早由社区提出并实现,ES6将其写进了语言标准,统一了用法,并原生提供了Promise对象。
- 含义: Promise是异步编程的一种解决方案,
- 优点: 相比传统回调函数和事件更加合理和优雅,Promise是链式编程(后面会详细讲述),有效的解决了令人头痛的回调地狱问题,Promise的结果有成功和失败两种状态,只有异步操作的结果,可以决定当前是哪一种状态,外界的任何操作都无法改变这个状态
- 基本用法:
我们用Promise的时候一般是包在一个函数中,在需要的时候去运行这个函数,如:
function p1(){
return new promise((resolve,reject)=>{
// 一些逻辑代码
if(true){
resolve()
}else{
reject();
}
})
}
// then 是一个函数。有两个参数,第一个参数就是接收resolve返回的数据。第二个参数接收reject返回的数据。
p1().then((data)=>{
// 接收resolve 返回的数据
},(data)=>{
// 接收reject的返回的数据
});
// catch // 接收reject传来的数据或者捕捉到then()中的运行报错时,做些什么
p1().catch(()=>{
})
// 不管什么状态都会执行到这
p.finally(()=>{
})
常用API
- resolve 返回异步操作成功的结果
- reject 返回异步操作失败的结果
- then 执行Promise状态是成功的操作
- catch 执行Promise状态是失败的操作
- finally 不管Promise状态是成功或失败都执行的操作
Promise.all
Promise.all方法用于将多个 Promise 实例,包装成一个新的 Promise 实例。
function p1(){
return new Promise((resolve)=>{
console.log("打印p1");
resolve("p1");
})
}
function p2(){
return new Promise((resolve)=>{
console.log("打印p2");
resolve("p2");
})
}
function p3(){
return new Promise((resolve)=>{
console.log("打印p3");
resolve("p3");
})
}
const p = Promise.all([p1(), p2(), p3()]).then((datas){
console.log(data);
})
//打印p1
//打印p2
//打印p3
//["p1", "p2", "p3"]
p的状态由p1、p2、p3决定,分成两种情况。
(1)只有p1、p2、p3的状态都变成fulfilled,p的状态才会变成fulfilled,此时p1、p2、p3的返回值组成一个数组,传递给p的回调函数。
(2)只要p1、p2、p3之中有一个被rejected,p的状态就变成rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数。