You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React+TypeScript中按钮onClick用异步匿名箭头函数是否为不良实践?

代码写法的不良实践分析

你的代码里确实存在几处不良实践,具体分析如下:

1. onClick事件处理中的冗余await与未捕获异常

按钮的onClick回调写了async () => await addUser(user),这里的await完全冗余——addUser本身已经返回Promise,不需要在箭头函数里额外await它。更关键的是,这个async函数如果抛出异常(比如请求失败),会产生未捕获的Promise rejection,生产环境可能导致应用崩溃,且无法直观看到错误原因。

2. 混合使用await与.then()链式调用

addUser函数里同时用了await fetch(...)和.then(),这种混合写法会让逻辑变得混乱,可读性大幅下降。async/await的设计初衷就是替代Promise链式调用,让异步代码更接近同步代码的写法,混用就失去了它的意义。

3. 缺失错误处理逻辑

你的fetch请求既没处理网络错误(比如断网时的请求失败),也没处理HTTP错误状态码(比如4xx、5xx)。默认情况下,fetch只有在网络层面失败时才会抛出异常,HTTP错误码不会触发reject,这会导致请求失败时你完全不知道问题出在哪,只能看到console.log的结果不符合预期。


改进后的代码示例

// 按钮点击事件:直接调用addUser,同时捕获异常
<button onClick={() => {
  addUser(user).catch(err => {
    console.error('添加用户失败:', err);
    // 这里可以添加用户友好提示,比如弹出错误弹窗
  });
}}>Submit</button>
async function addUser(user: User): Promise<void> {
  try {
    const resp = await fetch('user', {
      method: "POST",
      headers: {
        "Content-Type": "application/json"
      },
      body: JSON.stringify({
        UserId: user.id,
        UserName: user.user_name,
        Email: user.email
      })
    });

    // 主动处理HTTP错误状态码
    if (!resp.ok) {
      throw new Error(`请求失败: ${resp.status} ${resp.statusText}`);
    }

    const res = await resp.json();
    console.log(res);
  } catch (err) {
    console.error('请求出错:', err);
    // 可将错误抛出给调用方处理,或直接在这里完成错误逻辑
    throw err;
  }
}

内容的提问来源于stack exchange,提问作者Synapse explod

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 02:47:07