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
相关产品推荐
相关产品推荐

