# Promise
# 解决的问题(出现的背景)
回调地狱
# 什么是 Promise
异步编程的一种解决方案,更为直观、合理的处理异步 IO,Promise 属于微任务
# 状态
- Pending, 初始化的状态
- Fulfilled, resolve 状态
- Rejected, reject 状态 状态可以从 Pending => Fulfilled/Rejected,不可逆转
// 示例
const pro_one = () =>
new Promise((resolve, reject) => {
setTimeout(() => {
resolve("pro_one");
}, 3000);
});
const pro_two = () =>
new Promise((resolve, reject) => {
setTimeout(() => {
resolve("pro_two");
}, 3000);
});
pro_two()
.then(
(res) => {
console.log(res);
return pro_one();
},
() => {
console.log("catch");
}
)
.then((res) => {
console.log(res);
});
# API
# resolve
是个方法,可以是普通对象或数据类型,也可以是 Promise 对象。执行 resolve 之后,会调用 onFulfilled 函数。 参数为 Promise 对象时,该对象作为 resolve 方法的返回值返回。
const pro_one = new Promise((resolve, reject) => {
setTimeout(() => {
resolve("pro_one");
}, 3000);
});
const pro_two = Promise.resolve(pro_one);
console.log(pro_one === pro_two);
// 返回为true
# reject
类似于 resolve,但是返回 Promise 对象,不会作为 resolve 方法的返回值返回,执行 resolve 之后,会调用 onRejected 或 catch 函数。
const pro_one = () =>
new Promise((resolve, reject) => {
setTimeout(() => {
reject("pro_one");
}, 3000);
});
pro_one()
.then(
(res) => {
console.log(res);
},
(error) => {
console.log("error", error);
}
)
.catch((error) => {
console.log("catch", error);
});
// 返回为true
# then
实例方法,参数为函数,onFulfilled 和 onRejected。两个函数的参数分别为 resolve 和 reject 的传值。
在 onFulfilled 和 onRejected 中可以返回一个 Promise 或者一个其他结果,下面的 then 函数也可以接收。
参数为非函数,会发生值穿透。
Promise.resolve(1).then(2).then(Promise.resolve(3)).then(console.log);
// 1
# catch
用于接收异常,无 onRejected 函数,或者 onFulfilled 和 onRejected 执行报错的时候,都可以接收。也可以返回一个 Promise 或者一个其他结果。
# race
参数为数组,数组内为 Promise 任务,返回最先执行结束的任务结果,不管失败或者成功。
# all
参数为数组,数组内为 Promise 任务,全部执行完成后,返回执行结果,如果有一个失败,则会执行 onRejected 函数。只会将第一个返回的结果作为参数。
# 串行
每次执行一个 Promise 任务,一个任务执行结束之后,再去执行下一个 Promise 任务
const a = (a) =>
new Promise((r) => {
setTimeout(() => {
console.log("a:", a);
r(a);
}, 1000);
});
const arr = [1, 2, 3];
arr.reduce(
(prePromise, id) =>
prePromise.then(
(preId) =>
new Promise((r) =>
setTimeout(() => {
console.log(preId, id);
r(id);
}, 1000)
)
),
Promise.resolve(0)
);
arr.reduce(
(prePromise, id) => prePromise.then((preId) => a(id)),
Promise.resolve(0)
);