Vue之Axios的異步請(qǐng)求問(wèn)題詳解
遇到的問(wèn)題
在目前一個(gè)需求中,我需要等待axios請(qǐng)求完成后,判斷請(qǐng)求是否出現(xiàn)異常,然后來(lái)判斷是否關(guān)閉彈窗
修改后大概代碼如下:
async submitForm() {
let flag = false
//表單驗(yàn)證,默認(rèn)通過(guò)
let formValidation = true
this.$refs['vForm'].validate(valid => {
if (!valid){
formValidation = false
}
//TODO: 提交表單
})
if (formValidation === true){
//這里需要使用await,否則不會(huì)等待該方法運(yùn)行完成
await insertIllegalInfo(this.formData).then(res=>{
this.$message.success("新增成功")
flag = true
console.log("新增成功了")
console.log(flag)
})
}
console.log("提交馬上返回了")
console.log(flag)
return flag
},
原來(lái)在方法中沒(méi)有使用async和await,由于發(fā)送的axios請(qǐng)求是異步請(qǐng)求,所以在請(qǐng)求還沒(méi)完成的時(shí)候submitForm這個(gè)方法就已經(jīng)將flag返回了
這就導(dǎo)致了一個(gè)問(wèn)題,如果我在后端在處理請(qǐng)求的時(shí)候出現(xiàn)異常,我在這里無(wú)法進(jìn)行處理
經(jīng)過(guò)百度搜索,發(fā)現(xiàn)使用async+await能夠解決該問(wèn)題,將異步方法改為同步方法,在方法前面加上async進(jìn)行修飾,然后在axios請(qǐng)求前使用await進(jìn)行修飾即可,這樣就不會(huì)出現(xiàn)異步的問(wèn)題

這個(gè)問(wèn)題解決后,又出現(xiàn)了一個(gè)新的問(wèn)題,就是我在這里不是返回了一個(gè)flag嗎,我在另外一個(gè)vue頁(yè)面中需要獲取到return返回的這個(gè)flag,但是按照正常步驟獲取不到
后來(lái)經(jīng)過(guò)查詢資料后發(fā)現(xiàn)了原因,如下:
- async 是一個(gè)修飾符,async 定義的函數(shù)會(huì)默認(rèn)的返回一個(gè)Promise對(duì)象resolve的值,因此對(duì)async函數(shù)可以直接進(jìn)行then操作,返回的值即為then方法的傳入函數(shù)。
- await 也是一個(gè)修飾符,await 關(guān)鍵字 只能放在 async 函數(shù)內(nèi)部, await關(guān)鍵字的作用 就是獲取 Promise中返回的內(nèi)容, 獲取的是Promise函數(shù)中resolve或者reject的值。
- async/await 是一種編寫異步代碼的新方法。之前異步代碼的方案是回調(diào)和 promise。
- async/await 是建立在 promise 的基礎(chǔ)上。(如果對(duì)Promise不熟悉,我已經(jīng)著手在寫Promise的文章了)
- async/await 像 promise 一樣,也是非阻塞的。
- async/await 讓異步代碼看起來(lái)、表現(xiàn)起來(lái)更像同步代碼。這正是其威力所在。
主要原因就是async 定義的函數(shù)會(huì)默認(rèn)的返回一個(gè)Promise對(duì)象resolve的值,所以我們需要使用then去進(jìn)行取值,如下
submitInsertIllegalInfoDialog(){
//重要的是這里,這里調(diào)用了上面說(shuō)的的submitForm方法
this.$refs.insertIllegalInfoDialog.submitForm().then(flag=>{
console.log(flag)
if (flag === true){
console.log("馬上關(guān)閉彈窗了")
//這個(gè)是來(lái)關(guān)閉彈窗的
this.insertIllegalInfoDialogVisible = false
console.log("重新查詢")
this.getIllegalInfoList()
this.$refs.insertIllegalInfoDialog.resetForm();
}
})
},
總結(jié)
學(xué)會(huì)async和await的使用能夠讓我在開(kāi)發(fā)vue項(xiàng)目的時(shí)候更加靈活,之后在遇到axios異步請(qǐng)求沖突的時(shí)候可以參考本篇文章進(jìn)行解決
到此這篇關(guān)于Vue之Axios的異步請(qǐng)求問(wèn)題詳解的文章就介紹到這了,更多相關(guān)Vue Axios異步請(qǐng)求內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
electron-vue?運(yùn)行報(bào)錯(cuò)?Object.fromEntries?is?not?a?function
Object.fromEntries()?是?ECMAScript?2019?新增的一個(gè)靜態(tài)方法,用于將鍵值對(duì)列表(如數(shù)組)轉(zhuǎn)換為對(duì)象,如果在當(dāng)前環(huán)境中不支持該方法,可以使用?polyfill?來(lái)提供類似功能,接下來(lái)通過(guò)本文介紹electron-vue?運(yùn)行報(bào)錯(cuò)?Object.fromEntries?is?not?a?function的解決方案2023-05-05
解決vue-cli中stylus無(wú)法使用的問(wèn)題方法
這篇文章主要介紹了解決vue-cli中stylus無(wú)法使用的問(wèn)題方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06
Vue用Export2Excel導(dǎo)出excel,多級(jí)表頭數(shù)據(jù)方式
這篇文章主要介紹了Vue用Export2Excel導(dǎo)出excel,多級(jí)表頭數(shù)據(jù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04
完美解決通過(guò)IP地址訪問(wèn)VUE項(xiàng)目的問(wèn)題
這篇文章主要介紹了完美解決通過(guò)IP地址訪問(wèn)VUE項(xiàng)目的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-07-07
vue draggable resizable 實(shí)現(xiàn)可拖拽縮放的組件功能
這篇文章主要介紹了vue draggable resizable 實(shí)現(xiàn)可拖拽縮放的組件功能,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07
VUE使用localstorage和sessionstorage實(shí)現(xiàn)登錄示例詳解
這篇文章主要為大家介紹了VUE使用localstorage和sessionstorage實(shí)現(xiàn)登錄示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
Vue中keep-alive 實(shí)現(xiàn)后退不刷新并保持滾動(dòng)位置
這篇文章主要介紹了Vue中keep-alive 實(shí)現(xiàn)后退不刷新并保持滾動(dòng)位置的相關(guān)知識(shí),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03

