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

如何通过Promise.all从多个端点获取多份数据?代码返回Pending Promise的问题咨询

问题分析与解决办法

你遇到的问题核心在于:response.json()本身返回的是一个Promise,而不是直接的解析后数据。所以你第一个.then里返回的是两个未被解析的Promise组成的数组,当进入第二个.then时,dataOne和dataTwo其实还是处于pending状态的Promise对象,自然拿不到实际数据。

修正方案一:嵌套使用Promise.all

只需要在第一个.then里,把两个json()调用再用Promise.all包裹起来,确保它们都被解析完成后再传递给下一个.then:

Promise.all([ fetch(allAirportsURL, bearer), fetch(allFlightsURL, bearer) ])
 .then(([responseOne, responseTwo]) => {
   // 用Promise.all等待两个json()的Promise都完成解析
   return Promise.all([responseOne.json(), responseTwo.json()]);
 })
 .then(([dataOne, dataTwo]) => {
   console.log('data', dataOne); // 现在拿到的就是解析后的实际数据了
 })
 .catch((err) => {
   console.log(err);
 });

修正方案二:使用async/await(更直观)

如果你的环境支持ES2017+,用async/await写法会更清晰,避免嵌套的.then回调:

async function fetchData() {
  try {
    // 先等待两个fetch请求完成
    const [responseOne, responseTwo] = await Promise.all([
      fetch(allAirportsURL, bearer),
      fetch(allFlightsURL, bearer)
    ]);
    // 再等待两个json解析完成
    const [dataOne, dataTwo] = await Promise.all([
      responseOne.json(),
      responseTwo.json()
    ]);
    console.log('data', dataOne);
  } catch (err) {
    console.log(err);
  }
}

fetchData();

额外提示

别忘了检查每个response的状态码——fetch只有在网络层面失败时才会触发.catch,如果请求返回4xx/5xx的错误状态码,它不会自动抛出异常,建议手动判断:

.then(([responseOne, responseTwo]) => {
  if (!responseOne.ok) throw new Error(`Airports request failed: ${responseOne.status}`);
  if (!responseTwo.ok) throw new Error(`Flights request failed: ${responseTwo.status}`);
  return Promise.all([responseOne.json(), responseTwo.json()]);
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 11:48:14