1.promise实例
Promise 表示未来的某个时间一定会返回一个结果。
Promise 是一个容器,里面包裹了一些异步操作,它表示一个预计会在未来完成的异步操作。
PromiseState(promise状态) pending(进行中) fulfilled(已成功) rejected(已失败)。
Promise状态变化pending =>fulfilled 或者 pending=>rejected 不可逆的,而且一旦执行成功状态就会凝固 不会在发生其他变化了。
console.log(1)
let p1 = new Promise((resolve, reject)=>{
resolve("1")//成功后的回调
reject("2")//失败后的回调
console.log(2)
})
console.log(p1);
p1.then((resolve)=>{//异步操作
// resolve 成功后的结果
console.log(3)
console.log("resolve 成功后的结果",resolve);
},(reject)=>{
// reject 失败后的结果
console.log("reject 失败后的结果",reject);
}))
console.log(4)
//1243
2. Promise实例API
Promise实例上 有三个api 分别是: then(resolve=>{},reject=>{}),catch(err=>{}),finally(()=>{})
then() 方法中有两个回调函数 分别表示成功后的回调 和失败后的回调
let p1 = new Promise((resolve, reject)=>{
resolve("1")//成功后的回调
reject("2")//失败后的回调
})
console.log(p1);
p1.then((resolve)=>{//异步操作
console.log("resolve 成功后的结果",resolve);
},(reject)=>{
// reject 失败后的结果
console.log("reject 失败后的结果",reject);
}))
catch(err=>{}) 在创建或者使用promise的时候,如果代码报错那么会自动的走then.reject 如果在then中没有reject回调,会在catch中进行错误捕获, catch方法也会捕获在then方法中发生任何错误
let p1 = new Promise((resolve, reject) => {
if (1 > 0) {
resolve(1)
} else {
reject(2)
}
})
p1.then((resolve) => {
throw new Error("手动报错")
console.log("resolve 成功后的结果", resolve);
}, (reject) => {
console.log("reject 失败后的结果", reject);
}).catch((err)=>{
console.log("catch err===>", err);
})
console.log(p1);
finally(()=>{}) 无论promise执行成功或者失败,也无论catch方法是否执行, 最终finally都会执行
let p1 = new Promise((resolve, reject) => {
if (1 > 0) {
throw new Error("手动报错")
resolve(1)
} else {
reject(2)
}
})
p1.then((resolve) => {
console.log("resolve 成功后的结果", resolve);
}, (reject) => {
throw new Error("手动报错")
console.log("reject 失败后的结果", reject);
}).catch((err)=>{
console.log("catch err===>", err);
}).finally(()=>{
console.log("finally fin===>");
})
console.log(p1);
PromiseAPI和应用
Promise.all (全部)
(1)Promise.all 如果都成功就正常返回, 有一个失败,那么都会认为是失败的
(2)Promise.all里面的promise实例 都是并行的, 需要等到所有的promise实例都执行完后才会有结果
(3)promise实例都执行完之后 pAll状态变为已成功, 返回结果是参数的顺序
(4)当有任意一个失败 pAll会直接返回rejected, pAll的状态都是失败的
let p1 = new Promise((resolve, reject) => {
setTimeout(() => {//模拟异步
resolve("p1")
}, 1000)
});
let p2 = new Promise((resolve, reject) => {
setTimeout(() => {//模拟异步
resolve("p2")
}, 5000)
});
let p3 = new Promise((resolve, reject) => {
setTimeout(() => {//模拟异步
reject("p3")
}, 2000)
});
let pAll = Promise.all([p1, p2, p3]);
pAll.then(
resolve => {
console.log("成功后的回调",resolve);//"成功后的回调",["p1", "p2", "p3"]
},
reject => {
console.log("失败后的回调",reject);
})
Promise.race
Promise.race方法返回的也是一个promise对象, race方法谁先有结果就返回谁,无论成功还是失败(成功的就走resolve,失败就会在reject中返回).
let p1 = new Promise((resolve, reject) => {
setTimeout(() => {//模拟异步
reject("p1")
}, 1000)
});
let p2 = new Promise((resolve, reject) => {
setTimeout(() => {//模拟异步
resolve("p2")
}, 5000)
});
let p3 = new Promise((resolve, reject) => {
setTimeout(() => {//模拟异步
resolve("p3")
}, 2000)
});
let pRace = Promise.race([p1, p2, p3]);
pRace.then(
resolve => {
console.log("成功后的回调",resolve);//成功后的回调 p1
},
reject => {
console.log("失败后的回调",reject);//失败后的回调 p1
})