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

React中fetch调用为何需要两个then代码块?

为啥Fetch API需要两个then代码块?

嘿,这个问题问得特别到位——很多刚上手Fetch API的开发者都会有这个疑惑,我来给你拆解清楚其中的逻辑:

第一步:Fetch返回的是「响应对象」,不是直接的数据

当你调用fetch(url)时,它返回的是一个Promise,这个Promise成功resolve后,传给第一个then的参数是一个Response对象。这个对象里装的不是后端返回的业务数据,而是请求的元信息:比如HTTP状态码(200/404这些)、响应头、还有一个处于「可读流」状态的响应体(response.body)。你没法直接用这个流来做业务逻辑,必须先把它转换成可读取的格式。

第二步:转换响应体需要另一个Promise

为了把响应体转换成我们能用的格式(比如JSON、文本、Blob),Fetch给Response对象提供了一系列方法:response.json()、response.text()、response.blob()等等。这些方法的共同点是:它们本身也返回一个新的Promise——因为读取流是异步操作,得等流读取完成、格式转换好之后,才能拿到真正的数据。

所以第一个then的作用就是调用这些转换方法,把新的Promise传递下去,然后第二个then就会接收到转换后的实际数据,这时候你才能用它来渲染页面、做计算之类的操作。

举个直观的例子:

fetch('/api/user')
  .then(response => {
    // 这里的response是Response对象,不是后端返回的用户数据
    if (!response.ok) {
      throw new Error('请求失败');
    }
    // 调用json()返回新的Promise,等待流转换完成
    return response.json();
  })
  .then(userData => {
    // 这里的userData才是后端返回的{ id: 1, name: "张三" }这类数据
    console.log('拿到用户数据:', userData);
    // 在这里做业务逻辑,比如渲染用户信息
  })
  .catch(error => {
    console.error('处理出错:', error);
  });

额外补充:如果后端返回非JSON格式?

比如后端返回纯文本,那第一个then就换成response.text(),同样需要第二个then来接收文本内容:

fetch('/api/message')
  .then(response => response.text())
  .then(messageText => {
    console.log('收到消息:', messageText);
  });

简单总结一下:第一个then是处理「响应的元信息+启动响应体转换」,第二个then是接收「转换后的实际业务数据」——这俩步骤都是异步的,所以需要两个then来串联这两个异步操作~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:35:40