编程 安全赋值运算符:新的 JavaScript 提案让你告别 try-catch!

2024-11-19 07:48:48 +0800 CST views 1415

安全赋值运算符:新的 JavaScript 提案让你告别 try-catch!

在现代 Web 开发中,错误处理一直是一个重要但复杂的问题。传统的 try-catch 语句虽然功能强大,但容易导致代码冗长且难以维护。为了解决这一问题,ECMAScript 近期引入了一个新的提案:安全赋值运算符(Safe Assignment Operator,?=)


提案概要

安全赋值运算符 ?= 旨在简化错误处理。

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

这一运算符与 Promiseasync 函数以及任何实现了 Symbol.result 方法的对象兼容,简化了常见的错误处理流程。

示例

const [error, response] ?= await fetch("https://blog.conardli.top");

提案动机

  • 简化错误处理:通过消除 try-catch 块,简化错误管理流程。
  • 增强代码可读性:减少嵌套,提升代码的清晰度,使错误处理更加直观。
  • 跨 API 一致性:在不同 API 中建立统一的错误处理方法,确保行为一致性。
  • 提高安全性:减少忽略错误处理的风险,增强代码整体安全性。

使用示例

传统错误处理

async function getData() {
  const response = await fetch("https://blog.conardli.top");
  const json = await response.json();
  return validationSchema.parse(json);
}

使用 ?= 运算符

async function getData() {
  const [requestError, response] ?= await fetch("https://blog.conardli.top");

  if (requestError) {
    handleRequestError(requestError);
    return;
  }

  const [parseError, json] ?= await response.json();

  if (parseError) {
    handleParseError(parseError);
    return;
  }

  const [validationError, data] ?= validationSchema.parse(json);

  if (validationError) {
    handleValidationError(validationError);
    return;
  }

  return data;
}

提案功能

Symbol.result

任何实现了 Symbol.result 方法的对象都可以与 ?= 运算符一起使用,Symbol.result 方法返回一个数组,第一个元素为错误,第二个元素为结果。

function example() {
  return {
    [Symbol.result]() {
      return [new Error("报错啦!"), null];
    },
  };
}

const [error, result] ?= example();

递归处理机制

如果 data 也实现了 Symbol.result?= 运算符将递归处理它。这种递归机制适用于 Promise 或其他包含 Symbol.result 方法的对象。

const obj = {
  [Symbol.result]() {
    return [
      null,
      {
        [Symbol.result]() {
          return [new Error("Error"), null];
        },
      },
    ];
  },
};

const [error, data] ?= obj;

与 Promise 的兼容性

Promise?= 运算符支持的另一种常见对象类型。你可以将 ?=await 结合使用,处理异步操作。

const [error, data] ?= await getPromise();

Polyfill

由于该提案仍处于初期阶段,尚未纳入 JavaScript 标准。如果需要在当前环境中使用,可以通过 Polyfill 实现。


提案地址

复制全文 生成海报 JavaScript Web开发 错误处理 编程提案

推荐文章

Vue3中如何处理路由和导航?
2024-11-18 16:56:14 +0800 CST
JavaScript 策略模式
2024-11-19 07:34:29 +0800 CST
10个几乎无人使用的罕见HTML标签
2024-11-18 21:44:46 +0800 CST
Go语言中的`Ring`循环链表结构
2024-11-19 00:00:46 +0800 CST
Flet 构建跨平台应用的 Python 框架
2025-03-21 08:40:53 +0800 CST
快手小程序商城系统
2024-11-25 13:39:46 +0800 CST
php机器学习神经网络库
2024-11-19 09:03:47 +0800 CST
JavaScript 的模板字符串
2024-11-18 22:44:09 +0800 CST
Node.js中接入微信支付
2024-11-19 06:28:31 +0800 CST
Rust 并发执行异步操作
2024-11-19 08:16:42 +0800 CST
在 Nginx 中保存并记录 POST 数据
2024-11-19 06:54:06 +0800 CST
Rust 高性能 XML 读写库
2024-11-19 07:50:32 +0800 CST
Go配置镜像源代理
2024-11-19 09:10:35 +0800 CST
如何开发易支付插件功能
2024-11-19 08:36:25 +0800 CST
MyLib5,一个Python中非常有用的库
2024-11-18 12:50:13 +0800 CST
一些实用的前端开发工具网站
2024-11-18 14:30:55 +0800 CST
一键配置本地yum源
2024-11-18 14:45:15 +0800 CST
Web 端 Office 文件预览工具库
2024-11-18 22:19:16 +0800 CST
File 和 Blob 的区别
2024-11-18 23:11:46 +0800 CST
Redis和Memcached有什么区别?
2024-11-18 17:57:13 +0800 CST
用 Rust 玩转 Google Sheets API
2024-11-19 02:36:20 +0800 CST
如何在Rust中使用UUID?
2024-11-19 06:10:59 +0800 CST
PHP如何进行MySQL数据备份?
2024-11-18 20:40:25 +0800 CST
程序员茄子在线接单