📅  最后修改于: 2023-12-03 15:31:38.209000             🧑  作者: Mango
Promise是ES6中新增的异步编程解决方案,它是对异步操作的状态和结果进行抽象和封装,让异步操作更加容易和直观。Promise可以用来代替回调函数,让我们的代码更加详尽,易于维护。
Promise有三种状态,分别是 pending
(等待中)、fulfilled
(已完成)和rejected
(已失败)。当Promise状态变为fulfilled
或rejected
时,就称为Promise被解决了(Promise settled)。
创建一个Promise对象可以使用Promise
构造函数,语法如下:
const promise = new Promise((resolve, reject) => {
// 异步操作代码
});
Promise
构造函数的参数是一个函数,这个函数接受两个参数resolve
和reject
。当异步操作完成时,调用resolve
函数将Promise的状态变为fulfilled
;当异步操作失败时,调用reject
函数将Promise的状态变为rejected
。
接下来,我们可以给Promise对象加上相应的方法来处理异步操作的结果:
promise.then(onFulfilled, onRejected)
then
方法接受两个参数,分别是Promise解决时的回调函数onFulfilled
和Promise拒绝时的回调函数onRejected
,这两个函数都是可选的。
Promise.resolve
方法返回一个以给定值解决的Promise对象。如果传入的是一个thenable对象或者Promise对象,则直接返回该对象。如果传入的是一个错误对象,则返回的Promise对象的状态为rejected。如果没有传入参数,则返回一个状态为fulfilled的Promise对象。
Promise.resolve(value)
Promise.reject
方法返回一个被拒绝的Promise对象,其reason值为传递的参数。
Promise.reject(reason)
Promise.all
方法是将多个Promise对象包装成一个Promise对象,并等所有Promise解决后才进行后续处理。
Promise.all([promise1, promise2, ...])
Promise.race
方法是将多个Promise对象包装成一个Promise对象,并只等最先解决的Promise对象,忽略解决的先后顺序。
Promise.race([promise1, promise2, ...])
Promise地狱是指过多的嵌套Promise对象导致代码难以阅读和维护。为了解决Promise地狱,我们可以使用async/await语法糖。
async function fetchData() {
const data1 = await asyncFunc1(params1);
const data2 = await asyncFunc2(params2);
const data3 = await asyncFunc3(params3);
return { data1, data2, data3 };
}
使用async/await语法糖可以使我们的代码更加直观清晰。同时,使用Promise.all也可以使嵌套的Promise对象更清晰。
async function fetchData() {
const [data1, data2, data3] = await Promise.all([asyncFunc1(params1), asyncFunc2(params2), asyncFunc3(params3)])
return { data1, data2, data3 };
}
在Promise链中,如果有一个Promise对象被拒绝(rejected),那么整个链都会停止执行,并且直接跳到最后的catch方法。可以在catch方法中统一处理Promise链中的错误,也可以在每个Promise中使用try-catch来处理错误。
async function fetchData() {
try {
const data1 = await asyncFunc1(params1);
const data2 = await asyncFunc2(params2);
const data3 = await asyncFunc3(params3);
return { data1, data2, data3 };
} catch (error) {
console.error(error)
}
}
Promise是异步编程中必不可少的一部分,它让我们的异步操作更容易理解和维护。对于想要学习使用Promise的程序员而言,扎实的基础和丰富的练习是不可或缺的。