什么是promise
Promise是一个对象,用来传递异步操作信息,解决异步操作中回调地狱的问题,一个promise构造函数resolve()和reject(),是两个函数,分别决定promise的结果;
resolve---内部定义成功:调用函数value =>{};
reject---内部定义失败:调用函数reason=>{};
excutor函数-----promise函数的参数:执行器(resolve,reject) =>{};
excutor会在promise内部立即同时调用,异步操作在执行器中执行;
创建一个promise
//要创建Promise对象,我们使用Promise构造函数
let completed = true;
let learnJS = new Promise((resolve, reject) => {
if (completed) {
resolve("我已经完成JS学习");
} else {
reject("我未完成JS学习");
}
});
promise的三种状态
pending(待定状态):当promise执行还没有执行完毕的时候;
let completed = true;
let learnJS = new Promise((resolve, reject) => {
setTimeout(() => {
if (completed) {
resolve("我已经完成JS学习");
} else {
reject("我未完成JS学习");
}
}, 5 * 1000);
});
console.log(learnJS);
//输出:Promise {<pending>}
fulfilled(操作成功):当promise执行了resolve;
//5s后打印
console.log(learnJS);
//输出:Promise {<fulfilled>: '我已经完成学习'}
rejected(操作失败):当promsie执行了reject;
当promise的状态变为成功或失败后,状态是不能再改变的;
promise的链式写法
then函数会返回一个新的promise,因此可以使用链式写法链接then函数,每一个then中promise的结果会交给下一个then来处理。
promise.then(
//handlePromise
).then(
//handlePromise
).then(
//handlePromise
).then(
//handlePromise
)
如果then中没有第二个处理reject的函数的话,链式调用会直接进行下一轮的操作,如果省略then函数中所有的第二个处理reject的函数,那就可以在链式调用的最后写catch来处理所有链式调用中发生的所有错误。
promise.then(
// handleResolvedA
).then(
// handleResolvedB
).then(
// handleResolvedC
).then(
// handleResolvedD
).catch(err => console.log(err)) // 统一错误处理
then、catch、finally
1)then()
用来设置promise变成resolved成功状态时的回调
可传入两个回调函数,onRejected用来设置rejected失败时的回调
promiseObject.then(onFulfilled, onRejected);
//写个函数返回promise对象
function makePromise(completed) {
return new Promise((resolve, reject) => {
setTimeout(() => {
if (completed) {
resolve("我已经完成JS学习");
} else {
reject("我未完成JS学习");
}
}, 5 * 1000);;
});
}
//把上面的learnJS改成用函数来返回,接着用then来设置相应的回调函数
let learnJS = makePromise(true);
learnJS.then(
success => console.log(success),
fail => console.log(fail)
);
// 5秒后输出:我已经完成JS学习
2)catch()
catch()用来设置promise变成rejected失败时的回调
let learnJS = makePromise(false);
learnJS.catch(
fail => console.log(fail)
);
// 5秒后输出:我未完成JS学习
3)finally()
设置无论promise变成resolved/rejected成功或是失败都会执行