📅  最后修改于: 2023-12-03 15:06:45.208000             🧑  作者: Mango
在JavaScript中,我们可以使用异步编程技术来使程序在执行IO操作时不会阻塞。通常来说,我们有两种方式来实现异步编程:callback函数和Promise。近年来,JavaScript的async/await语法已经成为了应对异步编程的主流方式。本文将会介绍async/await语法,并通过多个示例展示如何使用它实现并行和顺序执行异步操作。
async/await语法是在ES2017标准中被引入的。它是基于Promise的语法糖,让异步编程更加容易理解和编写。async函数返回一个Promise对象,可以使用 await 等待其他 Promise 对象的值,并且可以在函数中使用 try/catch 语句处理错误。
下面是一个示例:
async function myAsyncFunction() {
const result = await somePromise();
console.log(result);
}
在这个例子中,我们使用了 async 关键字来定义 myAsyncFunction 函数。函数内部使用了 await 关键字等待一个 Promise 对象,在 Promise 对象完成后,await 表达式会返回 Promise 对象的结果。如果它对应的 Promise 对象被 reject,await表达式会抛出异常,进入到函数中的 catch 语句。
使用 async/await,我们可以便捷地执行多个并发的异步操作。如果我们要执行多个异步操作,但是并不需要等待它们全部完成之后再进行下一步操作,我们可以使用 Promise.all 方法。
下面是一个例子,展示如何使用 Promise.all 实现并行执行异步操作:
async function getBlogPostAndComments() {
const [blogPost, comments] = await Promise.all([
fetch('/api/blogpost'),
fetch('/api/comments'),
]);
console.log(blogPost, comments);
}
上面这个例子中,我们使用了 Promise.all 将两个异步操作同时进行。当这两个异步操作都完成后,我们就可以获取到它们的结果,并进行后续的操作。
在有些情况下,我们需要按顺序执行一系列异步操作。在这种场景下,我们可以将多个异步操作组成一个链。下面是一个例子:
async function getMessage() {
const message1 = await fetch('/api/msg/1');
const message2 = await fetch('/api/msg/2');
const message3 = await fetch('/api/msg/3');
console.log(message1, message2, message3);
}
在上面这个例子中,我们使用了三个 await 表达式,依次获取了三条消息。即使这三个异步操作都是在返回前进行了等待,但是由于它们是按照顺序组成的链,所以这个 async/await 函数本身始终是异步的。
当然,如果我们不希望在等待操作完成时阻塞主线程,我们可以使用 Promise.all 将多个异步操作组合在一起,这样它们就可以并行执行。
使用 async/await 语法可以使异步编程更加可读和可维护。我们可以使用它快速实现并发或者顺序执行异步操作。需要注意的是,虽然 async/await 语法可以让异步编程更加类似同步编程,但是它仍然是异步编程,需要根据实际情况组织好异步操作的执行顺序。