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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 20:40:29