解决的问题
Promise解决的问题是异步场景下的回调地狱问题,它能够使异步代码更加清晰、简洁。
Promise规范
Promise A+规定:
1、所有的异步场景、都可以看作是一个异步任务,每个异步任务,在js中表现为一个对象,该对象称之为Promise对象,也叫做任务对象。
2、每个任务对象,都应该有两个阶段、三个状态
它们之间存在以下逻辑:
任务总是从未决阶段变到有已决阶段,无法逆行
任务总是从挂起状态变到完成状态或失败状态,无法逆行
任务一旦完成或失败,状态就固定下来,永远无法改变
3、从挂起到完成,叫做resolve,从挂起到失败叫做reject。任务完成时,可能有一个相关数据任务失败时,可能有一个失败原因。
4、可以针对任务进行后续处理,针对完成状态的后续处理称之为onFulfilled
,针对失败状态的后续处理称之为onRejected
Promise API
Promise API是ES6提供的,实现了Promise A+规范
const pro = new Promise((resolve, reject) => {
// 任务的具体执行流程,该函数会立即被执行
// 调用 resolve(data),可将任务变为 fulfilled 状态, data 为需要传递的相关数据
// 调用 reject(reason),可将任务变为 rejected 状态,reason 为需要传递的失败原因
});
pro.then(
(data) => {
// onFulfilled 函数,当任务完成后,会自动运行该函数,data为任务完成的相关数据
},
(reason) => {
// onRejected 函数,当任务失败后,会自动运行该函数,reason为任务失败的相关原因
}
);
示例代码:
// 任务描述
const token = function getToken() {
return new Promise((resolve, reject) => {
//随机一个0到100的随机数,用来描述任务成功和失败的两中情况
const num = Math.floor(Math.random() * 100);
if (num <= 50) {
resolve("success");
}else {
reject("fail");
}
})
}
//任务结果的后续处理
token().then(res => {
console.log(res);
}, err => {
console.log(err);
})
catch方法
.catch(onRejected) = .then(null,onRejected) //两者是等效的