使用async/await语法遇问题:调用后仅返回Promise而非预期值
问题分析与修正
你的代码存在几个关键错误,导致无法得到预期结果:
错误点梳理
- 同步函数无法等待异步操作:
getValue是同步函数,调用异步的retrieveDetails时没有等待其执行完成,直接返回mymap.get(key),此时异步请求还未结束,mymap中还没有存入目标数据,自然返回空值;若想获取异步完成后的结果,getValue必须支持异步等待。 - Map方法使用错误:
mymap.put(key, response)是错误的,JavaScript的Map对象添加元素的方法是set,不是put,这会导致数据无法正确存入mymap。 - 响应体未解析:
retrieveDetails中直接将Response对象存入mymap,而非解析后的实际响应数据(如JSON、文本等),即使存入成功,也不是你需要的业务数据。 - 语法错误:
let url = '/myurl);存在单引号未闭合的问题,会导致代码报错。 - async函数混用await与then:
await fetch后又链式调用then,逻辑冗余且容易混淆,async函数中建议统一用await处理异步操作。
修正后的代码
// mymap 是全局变量 async function retrieveDetails(key){ const url = '/myurl'; // 修正单引号闭合问题 const response = await fetch(url, { headers: { 'Content-Type': 'application/json', 'Authorization' : 'Bearer '+accessToken } }); // 根据实际响应格式选择解析方式,这里以JSON为例 const data = await response.json(); mymap.set(key, data); // 改用Map的set方法存入数据 } async function getValue(key){ if(!mymap.has(key)){ await retrieveDetails(key); // 等待异步请求完成后再继续 } return mymap.get(key); } // 调用示例:由于getValue是async函数,需用await或.then获取结果 async function init() { const result = await getValue('foo'); console.log(result); // 此时能拿到正确的响应数据 } init(); // 或者用.then链式调用 getValue('foo').then(result => { console.log(result); });
关键说明
- 所有涉及异步操作的函数(包括依赖异步函数的函数)都需要定义为
async,并通过await等待异步操作完成。 - 调用
async函数时,必须通过await(在async函数内部)或.then()方法来获取最终结果,直接赋值会得到Promise对象,这也是你之前看到控制台返回Promise的原因。
内容的提问来源于stack exchange,提问作者user1517566
相关产品推荐
相关产品推荐

