如何将Promise结果保存到变量?API数据获取赋值难题
解决你的Promise赋值与await使用问题
兄弟,我一眼就看穿你遇到的两个核心问题了:await只能在async函数内部使用,还有你对Promise链式调用的赋值逻辑搞错了。咱们一步步来解决:
问题1:全局作用域不能直接用await
你尝试写let abc = await fetchData()时出现的语法错误,是因为JS的规则明确要求:await关键字必须包裹在async标记的函数内部,全局作用域不支持直接用await(除非你在模块环境下,但大部分场景都是普通脚本)。
问题2:错误的赋值逻辑
你之前写的let abc = await fetchData().then(data => console.log(data));有两个问题:
then()方法本身返回的还是一个Promise,而且你在回调里只做了console.log,这个回调的返回值是undefined,所以abc最终拿到的是undefined,不是你要的数据。- 这也导致你后续的
console.log会先执行,因为Promise还在pending状态时,同步代码已经跑完了。
修正后的完整代码
先简化你的fetchData函数(多余的JSON转换可以删掉),然后把全局代码放进一个立即执行的async函数里:
async function fetchData() { const response = await fetch('API'); const data = await response.json(); // 这里不需要JSON.stringify再parse,response.json()已经帮你解析好对象了 return data; } // 用立即执行异步函数包裹全局逻辑,这样就能合法使用await了 (async function main() { // 等待fetchData完成,直接把返回值赋值给abc let abc = await fetchData(); console.log(abc); // 这里就能拿到你需要的数组了 // 这行代码会在abc拿到数据后才执行,不会提前打印 console.log('This should not be logged if \'abc\' does not have the data i need'); })();
另一种写法:用Promise链式调用(不推荐,但可以参考)
如果你不想用立即执行函数,也可以把后续逻辑放在then回调里,这样能保证代码顺序:
async function fetchData() { const response = await fetch('API'); return await response.json(); } fetchData().then(data => { let abc = data; console.log(abc); console.log('This should not be logged if \'abc\' does not have the data i need'); });
但这种写法的可读性不如async/await,尤其是逻辑复杂时,容易陷入“回调地狱”,所以优先推荐第一种方案。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

