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

如何在JavaScript中封装fetch为callApi函数并捕获所有错误?

解决方法

你现在的问题核心有两个:一是response.text()是异步方法,直接拼接会得到Promise对象而非实际文本;二是没必要手动包裹new Promise,因为myFetch()本身就返回Promise,直接链式调用或用async/await更简洁。

文本响应的正确实现

链式调用写法

function callApi() {
  return myFetch()
    .then(response => {
      if (response.ok) {
        // 成功时返回文本Promise,链式传递到后续逻辑
        return response.text();
      } else {
        // 先获取错误响应的文本内容,再抛出格式化错误
        return response.text().then(body => {
          throw new Error(`${response.status}: ${body}`);
        });
      }
    })
    .catch(error => {
      // 捕获fetch自身的错误(如网络问题、请求格式错误)并抛出
      throw error;
    });
}

Async/Await写法(更易读)

async function callApi() {
  try {
    const response = await myFetch();
    if (response.ok) {
      return await response.text();
    } else {
      const body = await response.text();
      throw new Error(`${response.status}: ${body}`);
    }
  } catch (error) {
    throw error;
  }
}

JSON响应的处理差异

处理JSON响应逻辑几乎一致,只需要把response.text()替换为response.json()即可。注意如果后端错误响应返回的是JSON格式,就用response.json()解析;如果是纯文本,还是用response.text(),根据实际情况调整:

async function callApiJson() {
  try {
    const response = await myFetch();
    if (response.ok) {
      return await response.json();
    } else {
      // 假设错误响应是JSON格式,解析后转为字符串抛出
      const errorBody = await response.json();
      throw new Error(`${response.status}: ${JSON.stringify(errorBody)}`);
    }
  } catch (error) {
    throw error;
  }
}

核心说明

  • response.text()和response.json()都是异步方法,必须通过await或.then()等待它们完成,才能拿到实际的响应内容。
  • 避免手动创建新Promise,利用myFetch()已有的Promise进行链式操作,代码更简洁且符合Promise最佳实践。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 22:25:33