- 使用場景:前端首次發起請求獲取數據,若失敗則每隔1s發起一次知道成功獲取數據為止
- 解決方案: 使用輪詢操作,涉及定時器的使用和關閉
(使用vue2代碼為例)
data() {return {pollingResult_en: null, // 處理輪詢結果bizId_en: '' // 請求需要攜帶的參數}},computed: { // 注意computed和watch的區別pollingData() {return this.pollingResult_en}},watch: {pollingData: function (newval) {// 請求數據為null,失敗,則輪詢if (newval == null) { var timer = setInterval(() => {setTimeout(() => {this.fetchResult(this.bizId_en)}, 0);}, 1000);} else {// 請求數據成功,則調用上傳文件窗口this.$refs['upload'].$children[0].$refs.input.click()clearInterval(timer) }// 頁面關閉的時候結束輪詢,使用$once(eventname, eventhandler) 一次性監聽事件,beforeDestroy在路由跳轉的時候不會觸發this.$once('hook:beforeDestroy', () => {clearInterval(timer)})}},methods: {// 查詢接口調用fetchResult() {fetchScanResult({ bizId: this.bizId }).then(res => {this.pollingResult = res.data})} }
下面是一個自己寫的一個具體應用中:
methods: {// 查詢接口調用fetchResult() {fetchScanResult({ bizId: this.bizId }).then(res => {if(res.data){// 關閉定時器clearInterval(this.timer)console.log('獲取數據成功')} else {// 輪詢this.timer = setInterval(()=>{setTimeout(() => {this.fetchResult()}, 0)}, 1000)}})} },beforeDestroy() {this.clearInterval(this.timer)}