最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解vue中使用axios對同一個接口連續(xù)請求導(dǎo)致返回?cái)?shù)據(jù)混亂的問題

 更新時(shí)間:2019年11月06日 09:55:00   作者:小小小華  
這篇文章主要介紹了詳解vue中使用axios對同一個接口連續(xù)請求導(dǎo)致返回?cái)?shù)據(jù)混亂的問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

業(yè)務(wù)上出現(xiàn)一個問題:如果連續(xù)對同一個接口發(fā)出請求,參數(shù)不同,有時(shí)候先請求的比后請求的返回?cái)?shù)據(jù)慢,導(dǎo)致數(shù)據(jù)順序混亂,或者數(shù)據(jù)被覆蓋的問題,所以需要控制請求的順序。

解決方法:

1.直接跟后臺溝通,將所有參數(shù)放到數(shù)組里后臺統(tǒng)一接收并返回所有數(shù)據(jù)再由前端進(jìn)行數(shù)據(jù)的拆分使用。

2.對于出現(xiàn)返回的數(shù)據(jù)混亂問題。

假設(shè)場景: 頁面中需要對三個部門請求對應(yīng)的部門人員,三個部門人員的數(shù)據(jù)為一個二維數(shù)組,連續(xù)發(fā)送請求,但由于返回?cái)?shù)據(jù)的順序不定,導(dǎo)致數(shù)組中的數(shù)據(jù)順序不是按照部門的順序。

解決方法:使用promise.all + axios。

//獲取部門人員的請求
getDepartPerson (departData) {
    let that = this
    return new Promise(function(resolve,reject) {
     that.$axios({
       method: 'get',
       url: ...,
       params: {
        ...
       }
      }).then(res => {
       const data = res.data.map(item => {
        return {
         value: item.userId,
         label: item.userName
        }
       })
       resolve(data)
      })
    })
    
   },
   
//使用promise.all控制返回的數(shù)據(jù)順序
setPersonData() {
    const data = [{
     departId: 1,
     departName: '部門1'
    }, {
     departId: 2,
     departName: '部門2'
    }, {
     departId: 3,
     departName: '部門3'
    }]
    let promise1 = this.getDepartPerson(data[0])
    let promise2 = this.getDepartPerson(data[1])
    let promise3 = this.getDepartPerson(data[2])
    console.log(promise1,promise2,promise3)
    let that = this
    Promise.all([promise1,promise2,promise3]).then(value => {
     console.log(value) //value返回的數(shù)據(jù)是按順序的
    })
   },
   

這里要注意

在promise中this不能指向vue的,所以在promise使用前賦值

let that = this

3.對于返回?cái)?shù)據(jù)出現(xiàn)覆蓋的問題

假設(shè)場景:切換菜單的時(shí)候總是會向后臺發(fā)送同一個請求,不同參數(shù)。且假設(shè)這幾個菜單共用vuex中的一個state,假設(shè)從a菜單切換到b菜單中,a返回的數(shù)據(jù)比b返回的慢,導(dǎo)致覆蓋了state,此時(shí)雖然切換到b菜單,但是頁面上的數(shù)據(jù)是a的數(shù)據(jù)。

解決方法:使用axios中的CancelToken,對于之前的請求進(jìn)行禁止。

//取消接口相同參數(shù)不同的處于pending狀態(tài)下的請求
export const pending = []
let CancelToken = axios.CancelToken
let cancelPending = (config) => {
 for(let i=pending.length-1; i>=0; i--){
  if (!!config) {
   if (pending[i].u === config.url && pending[i].delPending) {
    console.log('delete request')
    pending[i].f() // 取消請求
    pending.splice(i, 1) // 移除當(dāng)前請求記錄
   }
  } else {
   pending[i].f() // 取消請求
   pending.splice(i, 1) // 移除當(dāng)前請求記錄
  }
 }
}

接著在請求前進(jìn)行攔截

/**
 * 請求前攔截
 */
export function requestSuccessFunc (config) {
 cancelPending(config)
 config.cancelToken = new CancelToken((c) => {
  pending.push({'u': config.url, 'f': c, delPending: config.delPending})
 })
 return config
}

/**
 * 請求結(jié)果預(yù)處理
 * @param response
 * @returns {Promise<never>}
 */
export function responseSuccessFunc (response) {
 cancelPending(response.config)
}

拓展:如果在切換路由的時(shí)候可以將之前頁面中請求處于pengding狀態(tài)的取消

export function routerAfterEachFunc () {
 // 這里可以做路由后操作
 //切換路由時(shí)取消之前頁面處于pending的請求
 for(let i=pending.length-1; i>=0; i--){
  pending[i].f() // 取消請求
  pending.splice(i, 1) // 移除當(dāng)前請求記錄
 }
 console.log(pending)
}

....

const ROUTER = new Router({
 routes: CONST_ROUTER
})
ROUTER.afterEach(routerAfterEachFunc)
export default ROUTER

4.假設(shè)這里不是請求同一個接口,而是上一個接口返回的數(shù)據(jù)作為下一個接口請求的參數(shù),這是可以使用async await

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Vue reactive函數(shù)實(shí)現(xiàn)流程詳解

    Vue reactive函數(shù)實(shí)現(xiàn)流程詳解

    一個基本類型的數(shù)據(jù),想要變成響應(yīng)式數(shù)據(jù),那么需要通過ref函數(shù)包裹,而如果是一個對象的話,那么需要使用reactive函數(shù),這篇文章主要介紹了Vue reactive函數(shù)
    2023-01-01
  • VUE+element開發(fā)后臺管理的搜索功能

    VUE+element開發(fā)后臺管理的搜索功能

    這篇文章主要為大家詳細(xì)介紹了VUE+element開發(fā)后臺管理的搜索功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Vue.js學(xué)習(xí)記錄之在元素與template中使用v-if指令實(shí)例

    Vue.js學(xué)習(xí)記錄之在元素與template中使用v-if指令實(shí)例

    這篇文章主要給大家介紹了關(guān)于Vue.js學(xué)習(xí)記錄之在元素與template中使用v-if指令的相關(guān)資料,文中給出了詳細(xì)的示例代碼供大家參考學(xué)習(xí),相信對大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。
    2017-06-06
  • 淺談vue單頁面中有多個echarts圖表時(shí)的公用代碼寫法

    淺談vue單頁面中有多個echarts圖表時(shí)的公用代碼寫法

    這篇文章主要介紹了淺談vue單頁面中有多個echarts圖表時(shí)的公用代碼寫法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • 使用 Vue cli 3.0 構(gòu)建自定義組件庫的方法

    使用 Vue cli 3.0 構(gòu)建自定義組件庫的方法

    本文旨在給大家提供一種構(gòu)建一個完整 UI 庫腳手架的思路。通過實(shí)例代碼給大家講解了使用 Vue cli 3.0 構(gòu)建自定義組件庫的方法,感興趣的朋友跟隨小編一起看看吧
    2019-04-04
  • Vue組件設(shè)計(jì)之多列表拖拽交換排序功能實(shí)現(xiàn)

    Vue組件設(shè)計(jì)之多列表拖拽交換排序功能實(shí)現(xiàn)

    這篇文章主要介紹了Vue組件設(shè)計(jì)之多列表拖拽交換排序,常見的場景有單列表拖拽排序,多列表拖拽交換排序,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-05-05
  • vue3項(xiàng)目中引入ts的詳細(xì)圖文教程

    vue3項(xiàng)目中引入ts的詳細(xì)圖文教程

    最近項(xiàng)目需要將原vue項(xiàng)目結(jié)合ts的使用進(jìn)行改造,這個后面應(yīng)該是中大型項(xiàng)目的發(fā)展趨勢,下面這篇文章主要給大家介紹了關(guān)于vue3項(xiàng)目中引入ts的相關(guān)資料,需要的朋友可以參考下
    2022-09-09
  • Vue.js 單頁面多路由區(qū)域操作的實(shí)例詳解

    Vue.js 單頁面多路由區(qū)域操作的實(shí)例詳解

    這篇文章主要介紹了 Vue.js 單頁面多路由區(qū)域操作的實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • vue獲取驗(yàn)證碼倒計(jì)時(shí)組件

    vue獲取驗(yàn)證碼倒計(jì)時(shí)組件

    這篇文章主要為大家詳細(xì)介紹了vue獲取驗(yàn)證碼倒計(jì)時(shí)組件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • vue彈出框組件封裝實(shí)例代碼

    vue彈出框組件封裝實(shí)例代碼

    這篇文章主要介紹了vue彈出框組件封裝,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-10-10

最新評論

策勒县| 武鸣县| 浦县| 灵丘县| 剑川县| 长沙县| 望城县| 浮山县| 东兴市| 孟村| 铅山县| 杭州市| 乌兰察布市| 德令哈市| 诸城市| 平阴县| 丹寨县| 塔河县| 安化县| 两当县| 什邡市| 沂水县| 尚义县| 富阳市| 广安市| 温宿县| 南郑县| 文昌市| 固镇县| 湖州市| 平谷区| 辛集市| 云阳县| 南川市| 新建县| 黄骅市| 循化| 营口市| 丰镇市| 肥城市| 五原县|