惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Google DeepMind News
Google DeepMind News
博客园 - 司徒正美
WordPress大学
WordPress大学
爱范儿
爱范儿
小众软件
小众软件
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
罗磊的独立博客
博客园_首页
V
V2EX
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
T
Tailwind CSS Blog
大猫的无限游戏
大猫的无限游戏
The Cloudflare Blog
MyScale Blog
MyScale Blog
IT之家
IT之家
H
Help Net Security
Blog — PlanetScale
Blog — PlanetScale
Microsoft Security Blog
Microsoft Security Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Recent Announcements
Recent Announcements
F
Fortinet All Blogs
The GitHub Blog
The GitHub Blog
Y
Y Combinator Blog
人人都是产品经理
人人都是产品经理

蚊子的前端博客

微说 | 有的人觉得只要不考XX,一定能考好!-蚊子的前端博客 微说 | 春天来了-蚊子的前端博客 明天和意外不知道哪个先来-蚊子的前端博客 微说 | 既然错过了路口,就及时止损,重新规划路线上路-蚊子的前端博客 微说 | 2025年的出生人口数是792万-蚊子的前端博客 微说 | 工作年终总结,让写对接的接口的数量?-蚊子的前端博客 微说 | 温家宝:没有政治体制改革的成功 经济体制改革不可能进行到底-蚊子的前端博客 微说 | 违法犯罪了该不该被禁言?-蚊子的前端博客 微说 | 不明白为什么在推荐去俄罗斯旅游-蚊子的前端博客 微说 | 易中天论骗子-蚊子的前端博客 微说 | 一场大风吹散了秋天-蚊子的前端博客 微说 | 既要、又要、还要、更要!-蚊子的前端博客 又是一年的国庆雨季-蚊子的前端博客 微说 | 预估下2025年的出生人口数据-蚊子的前端博客 微说 | 可惜了我那些小时候的书本-蚊子的前端博客 微说 | 牛马有的是,驴不够了!-蚊子的前端博客 微说 | 能否有一条非户口也能高考的路-蚊子的前端博客 微说 | 小聊中医-蚊子的前端博客 微说 | 将要制作的一款新产品-蚊子的前端博客 微说 | 做人要有信-蚊子的前端博客 微说 | 好一个正义联盟-蚊子的前端博客 微说 | 都是见过吃过的主儿-蚊子的前端博客 微说 | 追求8小时工作制有错吗?-蚊子的前端博客 微说 | 如果尖锐的批评完全消失-蚊子的前端博客 微说 | 很好!-蚊子的前端博客 微说 | 封禁用户可以,但要告知具体原因-蚊子的前端博客 微说 | 面朝大海,春暖花开-蚊子的前端博客 微说 | 程序员的悲哀是什么?-蚊子的前端博客 微说 | 2025年出生人口的预测-蚊子的前端博客 前端在 LiveKit 中如何获取所有的参与者-蚊子的前端博客
安全赋值运算符,再也不用写 try-catch 了-蚊子的前端博客
author · 2024-08-28 · via 蚊子的前端博客

我们一般写 Promise 时,通常会有两种方式来处理 Promise 的异常:

  1. 使用catch方法来捕获异常;
  2. 使用try catch来捕获异常;

链式调用:

fetch("/api")
  .then((data) => {})
  .catch((err) => {
    console.error(err);
  });

使用try catch来捕获异常:

const fn = async () => {
  try {
    const data = await fetch("/api");
  } catch (err) {
    console.error(err);
  }
};

现在 JS 的语言标准规范 ECMAScript 近日提出了一个新提案:“安全赋值运算符”。使用 ?= 运算符将函数的结果转为元数组来简化错误处理,返回的结构为 [error, value]

如果函数抛出错误,则运算符返回 [error, null];如果函数执行成功,则返回[null, result]

const fn = async () => {
  const [err, response] ?= await fetch("/api");

  if (err) {
    console.error(err);
    return;
  }
  return response;
}

ECMAScript 的安全赋值运算符提案,受到了 Go、Rust 和 Swift 等语言中类似结构的启发,旨在通过引入新的运算符来简化代码中的错误处理逻辑,减少对传统 try-catch 代码块的依赖,从而使代码更加干净、高效且易于维护。

  • 新的安全赋值运算符(如 ?=)通过将函数的结果转换为元组([错误, 结果])来减少代码的嵌套深度,使得错误处理更加直观和易于理解。
  • 在处理异步代码时,这一运算符可以与 Promisesasync/await 无缝协作,使异步代码中的错误处理变得直接且高效。
  • 通过统一的返回元组模式,该运算符保持了错误处理方式的一致性,降低了错过关键错误的风险。
  • 减少了代码的复杂性和深度嵌套,使得代码更加线性且易于跟踪。

npm 上目前也已经有类似的库:await-to-js

import to from "await-to-js";

const fn = async () => {
  const [err, response] = await to(fetch("/api"));

  if (err) {
    console.error(err);
    return;
  }
  return response;
};

不过这次 ECMA 官方打算将其加入到标准里了。

新的安全赋值运算符提案,有的同学喜欢,有的同学不喜欢。喜欢这种方式的,可以减少对try-catch的依赖,降低代码的层级,逻辑上提前结束。而不太不喜欢的,比如经常写 Go 语言的同学,就经常吐槽该语言的 error 的处理方式。

对前端同学来说,实际上是多了一种开发的方式,喜欢用哪种、或者习惯用哪种,就用哪种方式。