JS异步函数callAPI调用API后,如何将JSON结果存入变量?
问题解决:async函数返回Promise而非JSON的处理
核心原因
所有async函数的返回值都会被自动包装成Promise,哪怕你return的是普通值。所以直接赋值alldocs1 = callAPI(...)得到的必然是Promise,而非实际的JSON数据。
第一步:优化callAPI函数
你当前的代码混用了await和.then(),既冗余又容易出错,建议统一用await风格重构:
async function callAPI(url, data) { try { const response = await fetch(url, { method: "POST", body: JSON.stringify(data), headers: { "Content-Type": "application/json" } }); // 先检查响应状态是否正常 if (!response.ok) { throw new Error(`请求失败:${response.status}`); } const result = await response.json(); console.log(result); return result; } catch (error) { console.error("请求出错:", error); // 抛出错误让调用方处理,也可返回默认值 throw error; } }
第二步:正确获取函数返回结果
有两种常用方式获取Promise的实际值:
方式1:使用await(推荐,代码更简洁)
如果你的JS Notebook支持顶级await(大部分现代环境都支持),直接在顶层用await:
// 直接用await获取结果 const alldocs1 = await callAPI("/api/allDocs/", { "portal_type": ["Quality Control Declaration"] }); const alldocs2 = await callAPI("/api/allDocs/", { "portal_type": ["Defect Declaration Operation"], "creation_date": "2022-08-22" }); console.log(alldocs1); // 现在是JSON数据 console.log(alldocs2);
如果环境不支持顶级await,就用立即执行的async函数包裹:
(async function() { const alldocs1 = await callAPI("/api/allDocs/", { "portal_type": ["Quality Control Declaration"] }); const alldocs2 = await callAPI("/api/allDocs/", { "portal_type": ["Defect Declaration Operation"], "creation_date": "2022-08-22" }); console.log(alldocs1); console.log(alldocs2); })();
方式2:使用.then()链式调用
这是传统Promise处理方式,适合不能用await的场景:
callAPI("/api/allDocs/", { "portal_type": ["Quality Control Declaration"] }).then(data => { const alldocs1 = data; console.log(alldocs1); }).catch(err => { console.error(err); }); callAPI("/api/allDocs/", { "portal_type": ["Defect Declaration Operation"], "creation_date": "2022-08-22" }).then(data => { const alldocs2 = data; console.log(alldocs2); }).catch(err => { console.error(err); });
额外优化:并行请求
如果两个API请求互不依赖,用Promise.all()并行调用能大幅提升速度:
// 同时发起两个请求,等待全部完成后获取结果 const [alldocs1, alldocs2] = await Promise.all([ callAPI("/api/allDocs/", { "portal_type": ["Quality Control Declaration"] }), callAPI("/api/allDocs/", { "portal_type": ["Defect Declaration Operation"], "creation_date": "2022-08-22" }) ]); console.log(alldocs1, alldocs2);
内容的提问来源于stack exchange,提问作者Dioxygen78
相关产品推荐
相关产品推荐

