如何让首个异步函数获取递归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
相关产品推荐
相关产品推荐

