0

0

async与await如何使用_处理异步操作有哪些技巧?

夜晨

夜晨

发布时间:2026-01-05 20:46:02

|

212人浏览过

|

来源于php中文网

原创

async/await 是 Promise 的语法糖,async 函数必返回 Promise 并自动包装返回值,await 只能在 async 函数中使用且仅暂停当前函数,多个独立请求应优先用 Promise.all 并行,错误处理必须用 try/catch 包裹每个 await。

async与await如何使用_处理异步操作有哪些技巧?

async/await 不是魔法,它只是 Promise 的语法糖——用对了清爽如水,用错了照样掉坑里。

async 函数必须返回 Promise,但你可能没意识到它“自动包装”了返回值

声明一个 async 函数,哪怕里面全是同步代码,调用它也一定返回一个 Promise

async function getValue() {
  return 42;
}
console.log(getValue()); // Promise {: 42}

这意味着:
• 直接调用 getValue() 得到的是 Promise,不是 42
• 想拿到真实值,必须 await getValue()(在 async 函数内)或 getValue().then(...)(外部);
• 如果函数里 throw 错误,等价于返回 Promise.reject(...),所以一定要配 try/catch

await 只能用在 async 函数里,且只“暂停当前函数”,不卡主线程

常见错误:在普通函数或事件回调里直接写 await fetch(...) → 报错 SyntaxError: await is only valid in async function

  • ✅ 正确姿势:把逻辑包进 async 函数,再调用它
  • ❌ 错误姿势:button.addEventListener('click', () => { const data = await api(); })
  • ⚠️ 注意:await 后面如果不是 Promise,JS 会自动用 Promise.resolve(...) 包一层,比如 await 123 是合法的,但毫无异步意义

多个独立请求别傻傻串行 await,用 Promise.all 并行提速

连续写两个 await 就是串行执行,总耗时 ≈ 两请求之和;而它们彼此无关时,完全可并发发起:

Flowith
Flowith

一款GPT4驱动的节点式 AI 创作工具

下载
// ❌ 串行:慢
const user = await fetchUser();
const posts = await fetchPosts(); // 等 user 完了才发 posts 请求

// ✅ 并行:快
const [user, posts] = await Promise.all([fetchUser(), fetchPosts()]);

关键点:
Promise.all 返回的仍是 Promise,所以可以 await
• 任一失败会导致整个 Promise.all reject,如需容错,可用 Promise.allSettled
• 别在 forEach 里 await —— 它不会等待,只是“发出去就不管了”,结果不可控。

错误处理不是可选项,try/catch 必须包裹每个 await 表达式

fetch 失败、JSON 解析出错、后端返回 500……这些都会让 await 抛出异常。不捕获?页面白屏或控制台红字静默崩溃。

async function loadData() {
  try {
    const res = await fetch('/api/profile');
    if (!res.ok) throw new Error(`HTTP ${res.status}`);
    return await res.json();
  } catch (err) {
    console.error('加载失败:', err.message);
    // 这里可以 fallback 数据、上报错误、提示用户
    return null;
  }
}

补充提醒:
• 不要用 .catch() 链在 await 后面(语法错误);
finally 块适合放清理逻辑(如关闭 loading 状态),无论成功失败都执行;
• 在 React/Vue 组件中触发异步操作,还要防组件卸载后更新已销毁 state 的内存泄漏问题。

真正难的从来不是写对 async/await,而是判断哪些该串行、哪些该并行、哪些该降级、哪些该重试——语法只是表,逻辑才是里。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

404

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

531

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

308

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

74

2025.09.10

php中foreach用法
php中foreach用法

本专题整合了php中foreach用法的相关介绍,阅读专题下面的文章了解更多详细教程。

39

2025.12.04

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

520

2023.09.20

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

475

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

475

2023.08.10

漫蛙2入口地址合集
漫蛙2入口地址合集

本专题整合了漫蛙2入口汇总,阅读专题下面的文章了解更多详细内容。

13

2026.01.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Vue 教程
Vue 教程

共42课时 | 6万人学习

Vue3.x 工具篇--十天技能课堂
Vue3.x 工具篇--十天技能课堂

共26课时 | 1.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号