当前位置:首页 > 技术分析 > 正文内容

为讨厌 Async/Await JavaScript 的人员提供 7 个简单的异步/等待技巧

ruisui884个月前 (02-14)技术分析18

如果你也对异步 JavaScript 感到头疼,不妨试试以下这 7 个简单实用的技巧,它们可以让你重新爱上这项技术!


1.使用 Promise.allSettled() 进行更安全的批量处理

当你需要处理多个 Promise 时,Promise.all() 一旦遇到一个失败的 Promise 就会终止整个操作。而 Promise.allSettled() 则会等待所有 Promise 都完成(无论成功还是失败),并返回每个 Promise 的状态和值或错误信息。

const results = await Promise.allSettled([
  fetchData1(),
  fetchData2(),
  fetchData3(),
]);

results.forEach(result => {
  if (result.status === 'fulfilled') {
    console.log('成功:', result.value);
  } else {
    console.error('失败:', result.reason);
  }
});

通过这种方式,你可以安全地处理所有操作,而不用担心单个失败会影响整体流程。


2.为 Promise 添加超时功能,防止卡死

有些 Promise 可能会因为种种原因长时间悬而未决,为它们添加一个超时限制可以保护你的应用程序。

const withTimeout = (promise, ms) =>
  Promise.race([
    promise,
    new Promise((_, reject) =>
      setTimeout(() => reject(new Error('操作超时')), ms)
    ),
  ]);

try {
  const data = await withTimeout(fetchData(), 5000);
} catch (err) {
  console.error(err.message); // 如果超时,将输出 "操作超时"
}

通过这种方式,即使某个操作卡住,也不会拖累整个应用。


3.使用 for...of 实现顺序异步循环

虽然 forEach() 是个好工具,但它不能很好地支持 async/await。使用 for...of 进行顺序异步操作更加直观:

const urls = ['url1', 'url2', 'url3'];
for (const url of urls) {
  const data = await fetch(url);
  console.log(data);
}

这种方法可以确保每个请求依次执行,而不会互相干扰。


4.用 await 实现动态延时

在异步操作之间添加延时,可以通过 await 实现简单而优雅的方式,而不会阻塞主线程:

const delay = ms => new Promise(resolve => setTimeout(resolve, ms));

console.log('开始');
await delay(2000); // 等待 2 秒
console.log('结束');

这种技巧在模拟异步环境或控制操作节奏时非常有用。


5.在异步函数中始终使用 try...catch

即使在 async 函数中,也需要用 try...catch 来捕获错误。将其作为一种习惯,可以避免遗漏异常处理:

async function fetchData(url) {
  try {
    const response = await fetch(url);
    if (!response.ok) throw new Error('请求失败');
    return await response.json();
  } catch (err) {
    console.error('错误:', err.message);
    return null;
  }
}

这样可以确保函数的健壮性,即使请求失败也能 gracefully 处理。


6.在循环外使用 await 实现批量处理

如果操作不需要按顺序执行,可以通过批量处理提升性能:

const urls = ['url1', 'url2', 'url3'];
const responses = await Promise.all(urls.map(url => fetch(url)));
const data = await Promise.all(responses.map(res => res.json()));
console.log(data);

这种方法适合需要并行处理多个任务的场景,例如批量获取数据。


7.结合 Async/Await 和生成器处理复杂流程

生成器函数可以用作异步流程中的“检查点”,让复杂的逻辑变得更容易理解:

function* generator() {
  yield fetchData1();
  yield fetchData2();
  yield fetchData3();
}

const runGenerator = async gen => {
  const iterator = gen();
  for (const promise of iterator) {
    console.log(await promise);
  }
};

await runGenerator(generator);

这种方式可以让异步代码的逻辑更加清晰,尤其是在需要分阶段处理的场景下。

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/1945.html

标签: aysnc
分享给朋友:

“为讨厌 Async/Await JavaScript 的人员提供 7 个简单的异步/等待技巧” 的相关文章

用IDEA开发如何用Git快速拉取指定分支代码?

1,准备空的文件夹,git init2,关联远程仓库,git remote add origin gitlab地址3,拉取远程分支代码,git pull origin 远程分支名再用IDEA打开项目即可...

html5+css3做的响应式企业网站前端源码

大家好,今天给大家介绍一款,html5+css3做的响应式企业网站前端源码 (图1)。送给大家哦,获取方式在本文末尾。首页banner幻灯片切换特效(图2)首页布局简约合理(图3)关于我们页面(图4)商品列表(图5)商品详情(图6)服务介绍(图7)新闻列表(图8)联系我们(图9)源码完整,需要的朋友...

2024年,不断突破的一年

迈凯伦F1车队不久前拿下了2024年度总冠军,距离上一次还是二十几年前。在此期间,另一领域内,一个充满革新活力的腕表品牌——RICHARD MILLE理查米尔,正不断发展,与F1运动、帆船、古董车展等领域,共享着对速度与极限的无尽向往。RICHARD MILLE的发展与F1车手们在赛道上的卓越表现交...

《暗黑破坏神 2:重制版》PC 版 2.3 版本发布,支持英伟达 DLSS

IT之家 12 月 3 日消息,暴雪为《暗黑破坏神 2:重制版》PC 版发布了更新 2.3 版本,添加了“离线难度缩放”滑块(玩家可以在单人游戏时增加挑战和奖励的级别)、多项辅助功能和用户界面改进,以及英伟达 DLSS 支持。玩法改进:玩家现在可以在离线游戏的选项菜单中使用“游戏难度等级”,它提供与...

从 Vue2.0 到 React17——React 开发入门

作者:佚名来源:前端大全前言找工作时发现有一些公司是以React作为技术栈的,而且薪资待遇都不错,为了增加生存的筹码,所以还是得去学一下React,增加一项求生技能。因为我用Vue2.0开发项目已经四年了,故用Vue2.0开发项目的思路来学习React。前端项目是由一个个页面组成的,对于Vue来说,...

Vue进阶(二十六):详解router.push()

在Vue2.0路由跳转中,除了使用 <router-link> 声明式创建 a 标签来定义导航链接,还可以借助 router 的实例方法,通过编码式编写代码来实现。router.push(location)想要导航到不同的 URL,则使用 router.push 方法。这个方法会向 hi...