vue中axios非同步呼叫介面的坑
背景
最近在寫vue專案的時候遇到一個axios呼叫介面的坑,有個前端模組涉及axios去呼叫多個介面,然後請求完獲取資料之後,再使用windows.location.href重定向到新頁面,這時候卻發現axios請求的介面都是出於canceled的狀態。
例如:
axios.get('/url1')
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
axios.get('/url2')
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
windows.location.href="/
如果是這麼寫的話,由於axios呼叫介面是非同步的,極有可能在url1和url2還沒請求完畢的時候,windows.location.href就被執行了。這時在當前頁面開啟一個新的頁面,而通過chrome的f12控制檯檢視url1和url2請求都是處於canceled狀態。
StackOverflow網上查的canceled解釋如下:
1.The DOM element that caused the request to be made got deleted (i.e. an IMG is being loaded, but before the load happened, you deleted the IMG node)
2.You did something that made loading the data unnecessary. (i.e. you started loading a iframe, then changed the src or overwrite the contents)
3.There are lots of requests going to the same server, and a network problem on earlier requests showed that subsequent requests weren’t going to work (DNS lookup error, earlier (same) request resulted e.g. HTTP 400 error code, etc)
簡單來說,就是元素或者請求還未完成的時候,被打斷了。
解決方法
這裡有兩個方法:第一個就是直接把windows.location.href包裹在axios請求完成的處理流程裡。如下面:
axios.get('/url1')
.then(function (response) {
axios.get('/url2')
.then(function (response) {
windows.location.href="/"
})
.catch(function (error) {
console.log(error);
});
})
.catch(function (error) {
console.log(error);
});
這麼做的好處就是隻有等到url1和url2都請求成功後,頁面才會跳轉。但是有個新的問題,如果要多次請求url1和url2之後再進行跳轉該怎麼寫?例如:
for(迴圈)
{
axios.get('/url1')
.then(function (response) {
axios.get('/url2')
.then(function (response) {
})
.catch(function (error) {
console.log(error);
});
})
.catch(function (error) {
console.log(error);
});
}
windows.location.href="/"
如果是這樣的話,axios請求可能還沒完成就跳轉了。axios是非同步的,所以windows.location.href有可能先於axios執行完。
在這裡有個取巧的方法,使用定時器來延時windows.location.href的執行時機。
setTimeout(function() {
windows.location.href="/"
}, 2000);
這樣寫,基本可以保證windows.location.href在axios之後執行(取決於axios呼叫介面的和業務邏輯處理的時間)
博主:測試生財
座右銘:專注測試與自動化,致力提高研發效能;通過測試精進完成原始積累,通過讀書理財奔向財務自由。
csdn:https://blog.csdn.net/ccgshigao
相關文章
- vue中Axios的封裝和API介面的管理(更新)VueiOS封裝API
- 詳解vue中Axios的封裝與API介面的管理VueiOS封裝API
- Vue入門(四)Vue非同步操作AxiosVue非同步iOS
- Vue與Element走過的坑。。。。帶上AxiosVueiOS
- 同步阻塞、同步非阻塞、多路複用的介紹
- 使用vue2+Axios遇到的一些坑VueiOS
- vue-cli + es6 + axios專案踩坑VueiOS
- axios躺坑之路:cookie,簡單請求與非簡單請求。iOSCookie
- vue axiosVueiOS
- axios在vue中的實踐iOSVue
- vue中axios請求資料VueiOS
- js和vue方法的相互呼叫(iframe父子頁面的方法相互呼叫)。JSVue
- 埋坑一: vue中子元件呼叫兄弟元件方法Vue元件
- vue中axios請求的封裝VueiOS封裝
- vue中axios的使用與封裝VueiOS封裝
- vue中對axios進行封裝VueiOS封裝
- Fragment中呼叫startActivityForResult的那些坑Fragment
- vue 使用axiosVueiOS
- vue中呼叫問題Vue
- vue中axios如何實現token驗證VueiOS
- 05 . Vue前端互動,fetch,axios,以asyncawait方式呼叫介面使用及案例Vue前端iOSAI
- Vue3+AxiosVueiOS
- tornado原理介紹及非同步非阻塞實現方式非同步
- Spring Boot+Vue|axios非同步請求資料的12種操作Spring BootVueiOS非同步
- 同步非同步,阻塞非阻塞非同步
- 非同步、同步、阻塞、非阻塞非同步
- 非同步請求與中斷 ( XHR,Axios,Fetch對比 )非同步iOS
- chrome 控制檯console 呼叫vue頁面的方法--來自chatgpt的回答ChromeVueChatGPT
- axios的post請求爬坑iOS
- Vue 封裝axios(四種請求)及相關介紹(十三)Vue封裝iOS
- Dubbo原始碼分析(十)同步呼叫與非同步呼叫原始碼非同步
- Axios 非同步請求用法解析iOS非同步
- 同步、非同步,阻塞、非阻塞理解非同步
- 同步、非同步、阻塞與非阻塞非同步
- 同步非同步 與 阻塞非阻塞非同步
- 理解阻塞、非阻塞、同步、非同步非同步
- vue_resource和axiosVueiOS
- vue axios全攻略VueiOS