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ò)查詢(xún)資料后發(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 是一種編寫(xiě)異步代碼的新方法。之前異步代碼的方案是回調(diào)和 promise。
- async/await 是建立在 promise 的基礎(chǔ)上。(如果對(duì)Promise不熟悉,我已經(jīng)著手在寫(xiě)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("重新查詢(xún)") 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)文章
Vue中使用方法、計(jì)算屬性或觀察者的方法實(shí)例詳解
這篇文章主要介紹了Vue中如何使用方法、計(jì)算屬性或觀察者的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2018-10-10element-plus/element-ui走馬燈配置圖片及圖片自適應(yīng)的最簡(jiǎn)便方法
走馬燈功能在展示圖片時(shí)經(jīng)常用到,下面這篇文章主要給大家介紹了關(guān)于element-plus/element-ui走馬燈配置圖片及圖片自適應(yīng)的最簡(jiǎn)便方法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-03-03使用provide/inject實(shí)現(xiàn)跨組件通信的方法
在 Vue 應(yīng)用中,組件間通信是構(gòu)建復(fù)雜應(yīng)用時(shí)的一個(gè)常見(jiàn)需求,Vue3.x 提供了provide和inject API,讓跨組件通信變得更加簡(jiǎn)潔和高效,本文將深入探討如何使用provide和inject在Vue3.x中實(shí)現(xiàn)跨組件通信,并通過(guò)示例代碼一步步進(jìn)行說(shuō)明,需要的朋友可以參考下2024-03-03關(guān)于element-ui resetFields重置方法無(wú)效問(wèn)題及解決
這篇文章主要介紹了關(guān)于element-ui resetFields重置方法無(wú)效問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08Vue中使用v-print打印出現(xiàn)空白頁(yè)問(wèn)題及解決
這篇文章主要介紹了Vue中使用v-print打印出現(xiàn)空白頁(yè)問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09vue3+Typescript實(shí)現(xiàn)路由標(biāo)簽頁(yè)和面包屑功能
在使用 Vue.js 開(kāi)發(fā)后臺(tái)管理系統(tǒng)時(shí),經(jīng)常會(huì)遇到需要使用路由標(biāo)簽頁(yè)的場(chǎng)景,這篇文章主要介紹了vue3+Typescript實(shí)現(xiàn)路由標(biāo)簽頁(yè)和面包屑,需要的朋友可以參考下2023-05-05詳解vue 計(jì)算屬性與方法跟偵聽(tīng)器區(qū)別(面試考點(diǎn))
這篇文章主要介紹了詳解vue 計(jì)算屬性與方法跟偵聽(tīng)器區(qū)別(面試考點(diǎn)),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-04-04electron踩坑之remote of undefined的解決
這篇文章主要介紹了electron踩坑之remote of undefined的解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10