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

JavaScript中fetch返回的response无法存入字典是什么原因?

问题原因
  • 异步执行时序问题:fetch 是异步非阻塞 API,代码执行到 fetch 时只会把请求任务塞入事件队列,不会等待请求返回就会继续执行后续的同步代码。你在循环内同步打印 recipeData[recipes[i]]、循环结束后直接判断长度时,所有 fetch 请求都还未返回响应,对应字段自然是 undefined。
  • Promise 赋值错误:response.json() 本身返回的是一个 Promise 实例,你没有等待该 Promise 完成解析就直接赋值,哪怕请求结束,你存入字典的也不是接口返回的实际数据,而是未完成解析的 Promise 对象,无法直接读取到对应值。
  • 长度判断逻辑错误:你用普通对象(字典)存储数据,JS 中普通对象没有原生的 length 属性,recipeData.length 永远返回 undefined,不可能和 recipes.length 相等,该判断逻辑永远不会走到 resolve 分支。
修复方案

推荐用 Promise.all 批量处理并行异步请求,示例代码如下:

Promise.all(
  recipes.map(async (apiUrl) => {
    try {
      const res = await fetch(apiUrl);
      // 等待JSON解析完成再返回
      const resData = await res.json();
      return { apiUrl, resData };
    } catch (err) {
      console.error('Something went wrong fetching API', err);
      throw err;
    }
  })
).then(fetchResults => {
  // 所有请求全部成功后再统一给recipeData赋值
  fetchResults.forEach(({apiUrl, resData}) => {
    recipeData[apiUrl] = resData;
  });
  resolve(true);
}).catch(() => {
  reject('Could not fetch recipes');
});

该方案优势:

  • 自动等待所有请求+JSON解析全部完成后再执行后续逻辑,保证读取到的是完整的接口返回数据
  • 只要有一个请求失败就会直接触发catch逻辑,不需要手动判断请求完成数量,符合你的业务逻辑需求

内容的提问来源于stack exchange,提问作者David Em-Yinn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 00:36:07