JS async/await
最后修改于 2023 年 10 月 18 日
在本文中,我们将展示如何使用 async 和 await 关键字进行异步编程。
JavaScript 是一种异步编程语言。它使用 Promise 来处理异步操作。在引入 Promise 之前,异步操作由回调函数处理。
一个 Promise 是一个尚未完成的异步任务的占位符。(在某些编程语言中,Promise 称为 future。) async 和 await 关键字使基于 Promise 的异步行为能够以更简洁的风格编写。
使用 async 关键字,我们定义一个异步函数。每个 async 函数都返回一个 Promise。Async 函数可以包含零个或多个 await 表达式。await 关键字会暂停函数的执行,直到返回的 Promise 被履行或拒绝。
await 关键字仅在常规 JavaScript 代码中的 async 函数内有效。
JS async/await 简单示例
以下是一个使用 async/await 关键字的简单异步 JS 代码。
const work = () => {
return new Promise(resolve => {
setTimeout(() => resolve('doing work'), 3000);
})
}
const doWork = async () => {
console.log(await work());
}
console.log('before');
doWork();
console.log('after');
在这个例子中,我们有一个异步函数。
const work = () => {
return new Promise(resolve => {
setTimeout(() => resolve('doing work'), 3000);
})
}
work 函数是一个虚拟函数,代表一个持续三秒的任务。
const doWork = async () => {
console.log(await work());
}
doWork 是一个 async 函数,它调用 work。使用 await,它会暂停执行,直到 work 函数被解决。
doWork();
doWork 函数被调用。
$ node simple.js before after doing work
请注意,'doing work' 消息是在 console.log 语句之后打印的。因此,本质上,doWork 函数不会阻塞 main.js 文件中的语句。
在引入 async/await 关键字之前,使用了回调函数。
const work = () => {
return new Promise(resolve => {
setTimeout(() => resolve('doing work'), 3000);
})
}
console.log('before');
work().then(e => {
console.log(e);
console.log('finished');
});
console.log('after');
这是一个使用回调函数的相同示例。使用回调函数创建更复杂的异步代码比较困难。
JS async/await 与 fetch
fetch 是一个全局函数,它接受 url 和 options 参数,并返回一个 promise。该 promise 解决为请求的响应。
let promise = fetch(url, [options])
如果没有提供选项,则会生成一个简单的 GET 请求,用于下载 url 的内容。
<script>
async function doRequest() {
let url = 'http://webcode.me';
let res = await fetch(url);
if (res.ok) {
let text = await res.text();
return text;
} else {
return `HTTP error: ${res.status}`;
}
}
doRequest().then(data => {
console.log(data);
});
</script>
在浏览器中的 JS 代码中使用 fetch 生成一个异步 GET 请求。
JS async 截图
在下一个示例中,我们创建一个网页的截图。我们使用 Puppeteer 库。
$ npm i puppeteer
我们使用 npm i puppeteer 命令安装 Puppeteer。
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('http://webcode.me');
await page.screenshot({ path: 'webcode.png' });
await browser.close();
})();
在匿名函数内部,我们执行几个异步操作。每个操作都使用 await 等待。
来源
在本文中,我们使用 async 和 await 关键字创建了异步 JS 程序。