10 Promise与async/await

在上一篇教程中,我们学习了异步编程的基本概念,介绍了回调函数以及如何使用它来处理异步操作。然而,回调函数在处理复杂逻辑时容易引发“回调地狱”问题。为了解决这个问题,JavaScript引入了一种新的异步编程机制——Promise,以及在其之上的async/await语法,使得异步代码更加清晰和可维护。

什么是 Promise?

Promise对象代表一个异步操作的最终完成(或失败)以及其结果值。Promise有三种状态:

  1. Pending(等待中):初始状态,既不是成功,也不是失败。
  2. Fulfilled(已成功):操作成功完成。
  3. Rejected(已失败):操作失败。

创建一个 Promise

我们可以使用 Promise 构造函数来创建一个新的 Promise:

1
2
3
4
5
6
7
8
9
10
11
const myPromise = new Promise((resolve, reject) => {
// 异步操作
setTimeout(() => {
const success = true; // 假设操作成功
if (success) {
resolve("操作成功!");
} else {
reject("操作失败!");
}
}, 1000);
});

使用 Promise

我们可以使用 .then().catch() 方法来处理 Promise 的结果:

1
2
3
4
5
6
7
myPromise
.then(result => {
console.log(result); // 输出:操作成功!
})
.catch(error => {
console.error(error); // 处理错误
});

Promise 的链式调用

Promise 允许链式调用,这样我们可以在上一个 Promise 完成后进行下一步操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
const fetchData = () => {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve("获取数据成功!");
}, 1000);
});
};

fetchData()
.then(data => {
console.log(data); // 输出:获取数据成功!
return "处理数据"; // 将处理数据作为下一个 Promise 的返回值
})
.then(result => {
console.log(result); // 输出:处理数据
})
.catch(error => {
console.error(error);
});

async/await

async/await 是基于 Promise 的语法糖,使得异步代码看起来更像同步代码,便于阅读和维护。

定义 async 函数

通过在函数前加上 async 关键字,我们可以将其声明为 async 函数,返回一个 Promise

1
2
3
async function fetchDataAsync() {
return "异步获取数据!";
}

使用 await

async 函数内部,我们可以使用 await 来等待一个 Promise 的结果,这样代码会在 await 所在行暂停,直到 Promise 完成或失败:

1
2
3
4
5
6
7
8
9
10
async function main() {
try {
const result = await myPromise; // 等待 myPromise 的结果
console.log(result); // 输出:操作成功!
} catch (error) {
console.error(error); // 错误处理
}
}

main();

async/await 与链式调用

使用 async/await 可以让我们的代码更加简洁,如下是一个结合了多个异步操作的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
async function processData() {
try {
const data = await fetchData(); // 等待数据获取
console.log(data); // 输出:获取数据成功!
const processed = await new Promise((resolve) => {
setTimeout(() => {
resolve("数据处理完成!");
}, 1000);
});
console.log(processed); // 输出:数据处理完成!
} catch (error) {
console.error(error);
}
}

processData();

小结

在本篇教程中,我们深入探索了 Promise 对异步编程的改进,以及如何利用 async/await 使代码更加易读。我们从创建 Promise 到处理结果,再到链式调用和使用 async/await,都进行了详细的讲解和实例。如果你掌握了这些内容,将能够更好地处理 Node.js 中的异步操作。

在下一篇教程中,我们将学习如何使用 Node.js 的 HTTP 模块来创建一个基本的 HTTP 服务器,继续深入Node.js的世界。请继续关注!

作者

IT教程网(郭震)

发布于

2024-08-10

更新于

2024-08-10

许可协议

分享转发

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论