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

如何让首个异步函数获取递归fetch返回的bookdata?

解决方法:确保递归异步函数正确返回Promise

你的问题核心在于fetchRepeat函数没有正确返回Promise链,导致第一个异步函数的then无法获取到最终的bookdata。咱们一步步修正:

第一步:修复fetchRepeat函数

原来的函数存在两个关键问题:

  • 没有返回fetch调用生成的Promise
  • 递归调用时没有返回fetchRepeat(id)的结果

修正后的代码:

function fetchRepeat(id){ 
  // 这里一定要返回fetch的Promise,才能让后续链式调用拿到结果
  return fetch(`https://api.priceapi.com/v2/jobs/${id}/download.json?token=${priceapisecret.secret}`) 
  .then((response) => response.json())
  .then((data) => { 
    if(data.status === "finished"){ 
      const bookdata = { 
        title: data.results[0].content.name, 
        price: data.results[0].content.price 
      }; 
      return bookdata; // 返回结果,会被自动包装进Promise
    } else { 
      // 递归时必须返回这个Promise,才能继续传递结果链
      return fetchRepeat(id); 
    } 
  });
}

第二步:在第一个异步函数中获取bookdata

现在fetchRepeat会正确返回一个Promise,你可以在第一个函数的then链末尾直接拿到结果:

fetch("https://api.priceapi.com/v2/jobs", { 
  body: body, 
  headers: { "Content-Type": "application/x-www-form-urlencoded" }, 
  method: "POST" 
})
.then((response) => response.json())
.then((data) => fetchRepeat(data.job_id))
.then((bookdata) => {
  // 在这里就可以正常访问bookdata了!
  console.log("获取到的书籍数据:", bookdata);
  // 写你的后续业务逻辑
})
.catch((error) => {
  // 别忘了添加错误处理,避免请求失败时程序静默无响应
  console.error("请求过程出错:", error);
});

更易读的async/await版本

如果觉得链式then可读性差,用async/await重构会更直观:

async function getBookData() {
  try {
    // 第一步:发起创建任务的请求
    const jobResponse = await fetch("https://api.priceapi.com/v2/jobs", { 
      body: body, 
      headers: { "Content-Type": "application/x-www-form-urlencoded" }, 
      method: "POST" 
    });
    const jobData = await jobResponse.json();

    // 第二步:递归轮询直到任务完成
    const bookdata = await fetchRepeat(jobData.job_id);

    // 在这里直接使用bookdata
    console.log("获取到的书籍数据:", bookdata);
    return bookdata;
  } catch (error) {
    console.error("请求过程出错:", error);
  }
}

// 调用函数
getBookData();

// 可选:把fetchRepeat也改成async函数,代码更统一
async function fetchRepeat(id){ 
  const response = await fetch(`https://api.priceapi.com/v2/jobs/${id}/download.json?token=${priceapisecret.secret}`);
  const data = await response.json();
  if(data.status === "finished"){ 
    return { 
      title: data.results[0].content.name, 
      price: data.results[0].content.price 
    }; 
  } else { 
    // 递归等待,这里可以加个延迟避免频繁请求(比如await new Promise(r => setTimeout(r, 1000)))
    return fetchRepeat(id); 
  }
}

关键注意点

  • 异步/递归逻辑的核心是每一步都要返回Promise,这样结果才能在链式调用中传递下去
  • 务必添加错误处理,网络请求或API返回异常时能及时排查问题
  • 递归轮询API时,建议添加短延迟(比如1秒),避免请求过于频繁触发API限流

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:58:23