Node.js异步编程之Promise的高阶应用
2023-11-16 09:13:51
理解Promise
Promise是JavaScript中表示异步操作的最终完成或失败的返回值。它是一个对象,拥有三种状态:等待、完成和拒绝。
- 等待(pending):Promise的初始状态,表示异步操作尚未完成。
- 完成(fulfilled):异步操作成功完成,Promise将包含一个值。
- 拒绝(rejected):异步操作失败,Promise将包含一个错误对象。
Promise可以通过then
方法来处理完成和拒绝两种状态。then
方法有两个参数,第一个是处理完成状态的函数,第二个是处理拒绝状态的函数。例如:
const promise = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('异步操作成功');
}, 1000);
});
promise.then((result) => {
console.log(result); // 输出:异步操作成功
}, (error) => {
console.log(error); // 不会输出,因为异步操作成功了
});
Promise的高阶应用
1. Promise.all
Promise.all
方法可以接收一个Promise数组,并返回一个新的Promise。这个新的Promise会在所有传入的Promise都完成或拒绝后完成或拒绝。如果所有传入的Promise都成功完成,Promise.all
方法返回的Promise将包含一个数组,其中包含了所有传入Promise的返回值。如果其中任何一个传入的Promise拒绝,Promise.all
方法返回的Promise将立即拒绝,并且包含第一个拒绝的Promise的错误对象。例如:
const promise1 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('异步操作1成功');
}, 1000);
});
const promise2 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('异步操作2成功');
}, 2000);
});
const promise3 = new Promise((resolve, reject) => {
setTimeout(() => {
reject('异步操作3失败');
}, 3000);
});
Promise.all([promise1, promise2, promise3]).then((result) => {
console.log(result); // 输出:['异步操作1成功', '异步操作2成功', '异步操作3失败']
}, (error) => {
console.log(error); // 输出:异步操作3失败
});
2. Promise.race
Promise.race
方法可以接收一个Promise数组,并返回一个新的Promise。这个新的Promise会在第一个传入的Promise完成或拒绝后完成或拒绝。如果第一个传入的Promise成功完成,Promise.race
方法返回的Promise将包含第一个传入的Promise的返回值。如果第一个传入的Promise拒绝,Promise.race
方法返回的Promise将立即拒绝,并且包含第一个拒绝的Promise的错误对象。例如:
const promise1 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('异步操作1成功');
}, 1000);
});
const promise2 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('异步操作2成功');
}, 2000);
});
const promise3 = new Promise((resolve, reject) => {
setTimeout(() => {
reject('异步操作3失败');
}, 3000);
});
Promise.race([promise1, promise2, promise3]).then((result) => {
console.log(result); // 输出:异步操作1成功
}, (error) => {
console.log(error); // 不会输出,因为异步操作1成功了
});
3. Promise.finally
Promise.finally
方法可以接收一个函数,并返回一个新的Promise。这个新的Promise会在传入的Promise完成或拒绝后完成。无论传入的Promise是成功完成还是拒绝,Promise.finally
方法返回的Promise都会执行传入的函数。例如:
const promise = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('异步操作成功');
}, 1000);
});
promise.finally(() => {
console.log('异步操作完成'); // 输出:异步操作完成
}).then((result) => {
console.log(result); // 输出:异步操作成功
}, (error) => {
console.log(error); // 不会输出,因为异步操作成功了
});
结语
Promise是Node.js中异步编程的利器,它可以让你的代码更易读、更易维护,同时还能提高代码的性能。通过掌握Promise的高阶应用,你可以编写出更加优雅高效的异步代码。