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

在async/await返回语句中调用其他API失效问题求助

解决Axios请求顺序问题

你的问题核心是异步操作未等待:POST请求是异步执行的,代码里没等它完成就跑了后面的console.log('skip...')和return逻辑。至于加await报错,是因为你在普通的then回调里用了await,但这个回调没声明为async函数,语法不允许。

直接改代码就能解决,给你两种可行方案:

方案1:改造原有then链(在回调里加async)

把GET请求的then回调改成async函数,这样内部就能用await等待POST请求完成:

async getDashboards({commit}, id){
    return await axios.get(`${url}/groups/${group_id}/reports/${id}`)
        // 将回调声明为async函数
        .then(async (resp)=>{
            if(resp.data){
                try {
                    // 用await等待POST请求执行完毕
                    const dataResp = await axios.post('https://api', {
                        "datasets": [{'id' : resp.data.datasetId}],
                        "reports": [{'id' : id}], 
                        "targetWorkspaces": [{'id' : resp.data.datasetWorkspaceId }],
                    })
                    console.log('dataResp')
                    localStorage.setItem('embedded_token', dataResp.data.token)
                    localStorage.setItem('embedded_token_expiry_time', dataResp.data.expiration)
                    localStorage.setItem('embedded_token_ID', dataResp.data.tokenId)
                } catch (error) {
                    console.error('POST请求失败:', error)
                    return false
                }
                // 现在这行代码会等POST完成后才执行
                console.log('skip...')

                commit('addDashboard', resp.data)
                return resp.data
            }
            return false
        })
        .catch(() => false)
}

方案2:用async/await完全替代then链(更简洁易读)

推荐这种写法,避免回调嵌套,逻辑更清晰:

async getDashboards({commit}, id){
    try {
        // 等待GET请求完成
        const resp = await axios.get(`${url}/groups/${group_id}/reports/${id}`)
        if(resp.data){
            // 等待POST请求完成
            const dataResp = await axios.post('https://api', {
                "datasets": [{'id' : resp.data.datasetId}],
                "reports": [{'id' : id}], 
                "targetWorkspaces": [{'id' : resp.data.datasetWorkspaceId }],
            })
            console.log('dataResp')
            localStorage.setItem('embedded_token', dataResp.data.token)
            localStorage.setItem('embedded_token_expiry_time', dataResp.data.expiration)
            localStorage.setItem('embedded_token_ID', dataResp.data.tokenId)

            console.log('skip...')
            commit('addDashboard', resp.data)
            return resp.data
        }
        return false
    } catch (error) {
        console.error('请求失败:', error)
        return false
    }
}

关键说明:

  • 之前加await报错的原因:普通的then回调不是async函数,JS语法禁止在非async函数中使用await,所以必须把回调声明为async () => {}。
  • 用try/catch替代.catch()能更直观处理错误,避免错误被隐藏导致后续逻辑异常。
  • 两种方案都能保证POST请求完成后,才执行后续的console.log、commit和return操作。

内容的提问来源于stack exchange,提问作者Darshan Soni

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 12:55:15