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

JavaScript中Fetch调用始终返回Pending状态Promise的问题求助

JavaScript中Fetch调用始终返回Pending状态Promise的问题求助

兄弟我太懂你这种卡了好几天的崩溃感!先别慌,你的问题其实是对Promise的异步特性理解有点小偏差,咱们一步步把它捋清楚。

首先得给你拆解清楚为什么会出现这个情况:

  • fetch本身就是异步操作,它从一开始返回的就是一个Promise对象。你的nk函数里用了.then()链式调用,整个函数最终返回的依然是一个Promise——哪怕你控制台里看到它的[[PromiseState]]已经是fulfilled了,它本身的类型还是Promise,而不是你想要的那个数组结果。
  • 你看到的Promise {<pending>}其实是正常现象:当你直接打印nk()的返回值时,要么Promise还没走完异步流程,要么即使它已经完成了,它本身依然是Promise类型,你得主动去提取里面的结果才行。

好在你的核心逻辑是没问题的——控制台能打印出nk_json和"We're here!",说明数据已经成功获取并处理了,只是你没正确拿到最终的返回值。下面给你两个解决办法:

方案1:用async/await改造函数(更直观好读)

把nk改成async函数,用await来等待异步操作完成,代码结构会清晰很多,也更容易理解:

async function nk(args) {
  try {
    // 等待fetch完成拿到响应对象
    const result = await fetch(`${ourUrl}/assets/physics.json`);
    // 这里顺便解答你注释里的疑问:fetch返回的Response只是HTTP响应的外壳,.json()是把响应体解析成JS对象的异步方法,所以也需要await
    const nk_json = await result.json();
    console.log('nk_json:', nk_json);

    if (args[0] === 'list') {
      // 注意你原代码里的object.keys要改成Object.keys(大小写别错)
      return [Object.keys(nk_json).join('<br>')];
    } else {
      const array = nk_json[args[0]];
      const base_formula = array[0];
      const definitions = array[1].join('<br>');
      console.log("We're here!");
      return [
        `base formula for ${bi(args[0])}: ${base_formula}`,
        `contextual definitions: ${definitions}`
      ];
    }
  } catch (error) {
    // 别忘了加错误处理,不然fetch失败了连报错都看不到
    console.error('获取物理数据出错:', error);
    return ['数据获取失败,请稍后重试'];
  }
}

方案2:不修改原函数,正确调用它

如果你不想改nk的结构,那调用它的时候必须用.then()或者await来提取Promise里的结果,比如:

// 方式一:用.then()链式处理结果
nk(['velocity']).then(finalResult => {
  console.log('最终拿到的结果:', finalResult);
  // 在这里用finalResult做你要的操作,而不是直接打印nk()的返回值
}).catch(err => {
  console.error('调用出错:', err);
});

// 方式二:在async函数里用await
async function getPhysicsData() {
  try {
    const finalResult = await nk(['force']);
    console.log('最终拿到的结果:', finalResult);
    // 在这里使用结果
  } catch (err) {
    console.error('调用出错:', err);
  }
}
getPhysicsData();

最后再补一句你注释里的疑问:.then(result => result.json())真的很必要!因为fetch成功后返回的Response对象只是包含了HTTP响应的状态码、头部这些元信息,真正的JSON数据在响应体里,需要用.json()方法异步解析出来,所以必须加这一步才能拿到可用的nk_json。

总结一下:你的代码逻辑是对的,只是异步函数(包括用了then链的函数)必然返回Promise,你不能把它当普通值直接用,必须通过.then()或者await来解锁里面的结果~

备注:内容来源于stack exchange,提问作者permanito

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 12:49:29