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

