网易首页 > 网易号 > 正文 申请入驻

盘点JavaScript中Async/Await知识

0
分享至

作者: 前端进阶者 来源:前端进阶学习交流

一、前言

Async/await 是以更舒适的方式使用 promise 的一种特殊语法,同时它也非常易于理解和使用。

二、Async function

以 async 这个关键字开始。它可以被放置在一个函数前面。

如下所示:

async function f() { return 1; }

在函数前面的 “async” 这个单词表达了一个简单的事情:即这个函数总是返回一个 promise。其他值将自动被包装在一个 resolved 的 promise 中。

例如,下面这个函数返回一个结果为 1 的 resolved promise。

让测试一下:

async function f() { return 1; } f().then(alert); // 1

也可以显式地返回一个 promise,结果是一样的:

async function f() { return Promise.resolve(1); } f().then(alert); // 1

注:

async 确保了函数返回一个 promise,也会将非 promise 的纸包装进去。很简单,对吧?但不仅仅是这些。还有另外一个叫 await 的关键词,它只在 async 函数内工作,也非常酷。

三、Await

1. 语法

// 只在 async 函数内工作 let value = await promise;

关键字 await 让 JavaScript 引擎等待直到 promise 完成(settle)并返回结果。

这里的例就是一个 1 秒后 resolve 的 promise:

async function f() {
let promise = new Promise((resolve, reject) => {
setTimeout(() => resolve("done!"), 1000)
let result = await promise; // 等待,直到 promise resolve (*)
alert(result); // "done!"
f();

代码解析:

这个函数在执行的时候,“暂停”在了 (*) 那一行,并在 promise settle 时,拿到 result 作为结果继续往下执行。所以上面这段代码在一秒后显示 “done!”。

await 字面的意思就是让 JavaScript 引擎等待直到 promise settle,然后以 promise 的结果继续执行。这个行为不会耗费任何 CPU 资源,因为引擎可以同时处理其他任务:执行其他脚本,处理事件等。

相比于 promise.then,它只是获取 promise 的结果的一个更优雅的语法,同时也更易于读写。

不能在普通函数中使用 await。

如果尝试在非 async 函数中使用 await 的话,就会报语法错误:

function f() {
let promise = Promise.resolve(1);
let result = await promise; // Syntax error

如果函数前面没有 async 关键字,就会得到一个语法错误。就像前面说的,await 只在 async 函数 中有效。

showAvatar() 例子,并将其改写成 async/await 的形式:

需要用 await 替换掉 .then 的调用。

另外,需要在函数前面加上 async 关键字,以使它们能工作。

async function showAvatar() {
// 读取的 JSON
let response = await fetch('/article/promise-chaining/user.json');
let user = await response.json(); // 读取 github 用户信息
let githubResponse = await fetch(`https://api.github.com/users/${user.name}`);
let githubUser = await githubResponse.json(); // 显示头像
let img = document.createElement('img');
img.src = githubUser.avatar_url;
img.className = "promise-avatar-example";
document.body.append(img); // 等待 3秒
await new Promise((resolve, reject) => setTimeout(resolve, 3000));
img.remove();
return githubUser;
showAvatar();

简洁明了,是吧?比之前可强多了。await 不能在顶层代码运行。

这有一个用于演示的 Thenable 类

下面的 await 接收了该类的例子:

class Thenable {
constructor(num) {
this.num = num;
then(resolve, reject) {
alert(resolve); // 1000ms 后使用 this.num*2 进行 resolve
setTimeout(() => resolve(this·num * 2), 1000); // (*) { };
async function f() { // 等待 1 秒,之后 result 变为 2
let result = await new Thenable(1);
alert(result);
f();

运行结果:

注:

如果 await 接收了一个非 promise 的但是提供了 .then 方法的对象,它就会调用这个 .then 方法,并将内建的函数 resolve 和 reject 作为参数传入(就像它对待一个常规的 Promise executor 时一样)。

然后 await 等待直到这两个函数中的某个被调用(在上面这个例子中发生在 (*) 行),然后使用得到的结果继续执行后续任务。

2. Class 中的 async 方法

要声明一个 class 中的 async 方法,只需在对应的方法前面加上 async 即可:

class Waiter {
async wait() {
return await Promise.resolve(1);
new Waiter() .wait() .then(alert); // 1

运行结果:

注:

它确保了方法的返回值是一个 promise 并且可以在方法中使用 await。

四、总结

本文基于JavaScript基础,介绍了async的使用。函数前面的关键字 async 有两个作用:让这个函数返回一个 promise。允许在该函数内使用 await。

这两个关键字一起提供了一个很好的用来编写异步代码的框架,这种代码易于阅读也易于编写。通过案例的分分析,图文结合的方式,进行详细的讲解,使用JavaScript语言,能够让读者更好的理解。

代码很简单,希望能够帮助你更好地学习。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
闹大了!北师大男生实习期“拒上桌吃剩饭”,老师委屈哭诉引争议

闹大了!北师大男生实习期“拒上桌吃剩饭”,老师委屈哭诉引争议

火山詩话
2026-05-21 13:48:46
网传女演员景甜代孕并向富豪男友索要上亿钱款,工作室回应:相关传言为“恶意造谣”,已委托律师完成取证

网传女演员景甜代孕并向富豪男友索要上亿钱款,工作室回应:相关传言为“恶意造谣”,已委托律师完成取证

扬子晚报
2026-05-22 12:13:53
标价1980元的海景房,仅需1分钱?

标价1980元的海景房,仅需1分钱?

中国新闻周刊
2026-05-23 12:51:23
越是上流人越“下流”?狗仔再曝景甜猛料,远比私密照抵债更可怕

越是上流人越“下流”?狗仔再曝景甜猛料,远比私密照抵债更可怕

阿废冷眼观察所
2026-05-23 00:36:31
诺兰《奥德赛》四女主曝光,赞达亚演雅典娜

诺兰《奥德赛》四女主曝光,赞达亚演雅典娜

追星雷达站
2026-05-23 00:05:44
别只盯富途老虎的罚款

别只盯富途老虎的罚款

智远同学
2026-05-23 11:49:06
陈慧琳一家四口现身婆婆出殡仪式,丈夫捧遗照走出殡仪馆

陈慧琳一家四口现身婆婆出殡仪式,丈夫捧遗照走出殡仪馆

素素娱乐
2026-05-23 15:02:41
徐若晗回应不理方媛:好像之前没有找她说那么多,我愿意再去找她

徐若晗回应不理方媛:好像之前没有找她说那么多,我愿意再去找她

暖心萌阿菇凉
2026-05-23 11:17:07
韩媒:韩国老人在山上挖到12株野山参,估值达2.43亿!

韩媒:韩国老人在山上挖到12株野山参,估值达2.43亿!

随波荡漾的漂流瓶
2026-05-22 17:00:16
老婆给小舅子50万,我取光存款旅游,3小时后岳母来电:出大事了

老婆给小舅子50万,我取光存款旅游,3小时后岳母来电:出大事了

千秋文化
2026-05-10 19:50:58
网传女骑手越来越多了,说明了什么?评论区炸锅…

网传女骑手越来越多了,说明了什么?评论区炸锅…

慧翔百科
2026-05-20 17:27:17
澳大利亚多地观测到罕见“火流星”,目击者:巨大彩色球体闪烁夜空,“以为是不明飞行物”

澳大利亚多地观测到罕见“火流星”,目击者:巨大彩色球体闪烁夜空,“以为是不明飞行物”

新京报
2026-05-22 14:02:49
“余生好好走”,知名央视主持人王小丫,病床上的留言字字催泪

“余生好好走”,知名央视主持人王小丫,病床上的留言字字催泪

近史谈
2026-03-31 18:57:49
张郃曾提醒高览小心赵云,高览说:“文丑能打平手,我也可以。”

张郃曾提醒高览小心赵云,高览说:“文丑能打平手,我也可以。”

掠影后有感
2026-05-23 09:50:22
一男子借宿同学家行凶致1死1重伤,行凶者两次精神鉴定结论反转,被害人家属回应

一男子借宿同学家行凶致1死1重伤,行凶者两次精神鉴定结论反转,被害人家属回应

蓬勃新闻
2026-05-23 09:00:30
“穷人脸就是碳水脸”刷屏!网友破防了!

“穷人脸就是碳水脸”刷屏!网友破防了!

广告案例精选
2026-05-21 23:41:41
从满身纪念到彻底清空:维多利亚·贝克汉姆已激光去除全部纹身

从满身纪念到彻底清空:维多利亚·贝克汉姆已激光去除全部纹身

一盅情怀
2026-04-11 17:57:31
绿联推出45W单USB-C带屏充电头:“斜切”设计,119元

绿联推出45W单USB-C带屏充电头:“斜切”设计,119元

IT之家
2026-05-22 17:47:16
厉害!7个榴莲“吓跑”相亲男,女子做法,被网友认为是服从测试

厉害!7个榴莲“吓跑”相亲男,女子做法,被网友认为是服从测试

火山詩话
2026-05-22 07:08:20
沈月就《亲爱的客栈》颁奖环节让王鹤棣不舒服道歉,称“你只是个王鹤棣”的本意是他可以做回自己,解释拉小群用途是为其新电影包场

沈月就《亲爱的客栈》颁奖环节让王鹤棣不舒服道歉,称“你只是个王鹤棣”的本意是他可以做回自己,解释拉小群用途是为其新电影包场

鲁中晨报
2026-05-23 10:42:28
2026-05-23 16:24:49
Nodejs开发
Nodejs开发
分享只有程序员懂的干货
648文章数 823关注度
往期回顾 全部

科技要闻

爆炸声中又迈一步!拆解马斯克“十二飞”

头条要闻

总投资8亿的项目违规 民营建筑巨头诉广西贵港城管局

头条要闻

总投资8亿的项目违规 民营建筑巨头诉广西贵港城管局

体育要闻

少年意气,正在改变中国足球

娱乐要闻

歌手2026首播:胡彦斌破音 张碧晨跑调

财经要闻

股价暴跌!富途老虎是什么来头?

汽车要闻

与众07上市限时权益价10.99万起 首搭CEA架构

态度原创

时尚
本地
手机
教育
亲子

夏天,更适合穿“爸爸裤”!

本地新闻

用云锦的方式,打开江苏南京

手机要闻

Reno新机逆袭,中端机首上微云台

教育要闻

志愿填报别错过!黄埔区这所实力派黑马高中

亲子要闻

儿童补脑DHA哪款好?热门补脑产品实测:磷脂酰丝氨酸PS与神经酸健脑益智

无障碍浏览 进入关怀版