axios封裝(二)-隊列管理

來源:互聯網
上載者:User

標籤:傳回值   res   hand   fun   his   null   使用者   取消   erro   

在某些特定的情境(比如 立即搜尋表格分頁),會頻繁的發起ajax請求,而由於ajax是非同步API,所以返回的時序並不能夠保證,這時候就需要實現一個ajax隊列,在相同的請求發起時,取消處理上一個請求。

在使用 jquery.ajax 時,可以比較方便的使用 abort 方式中斷處理ajax傳回值,但是由於 axios 是依賴於 promise 的,導致了只能通過轉換為 Promsie.reject 的方式中斷處理。具體的代碼如下:

import axios from ‘axios‘;import Qs from ‘qs‘;// 上一篇文章中定義的錯誤處理檔案import httpErrorHandler from ‘./httpErrorHandler‘;const instance = axios.create();// 請求隊列const queue = [];// axios內建的中斷ajax的方法const cancelToken = axios.CancelToken;// 拼接請求的url和方法,同樣的url+方法可以視為相同的請求const token = (config) =>{  return `${config.url}_${config.method}`}// 中斷重複的請求,並從隊列中移除const removeQueue = (config) => {  for(let i=0, size = queue.length; i < size; i++){    const task = queue[i];    if(task.token === token(config)) {      task.cancel();      queue.splice(i, 1);    }  }}//添加請求攔截器instance.interceptors.request.use(config=>{  removeQueue(config); // 中斷之前的同名請求  // 添加cancelToken  config.cancelToken = new cancelToken((c)=>{    queue.push({ token: token(config), cancel: c });});  return config;}, error => {  return Promise.reject(error);});//添加響應攔截器instance.interceptors.response.use(response=>{  // 在請求完成後,自動移出隊列  removeQueue(response.config);  return response.data}, httpErrorHandler);/** * 封裝後的ajax post方法 * * @param {string} url 請求路徑 * @param {object} data 請求參數 * @param {object} config 使用者自訂設定 * @returns */ function post (url, data, config = {}) => {  return instance.post(url, data, config)}/** * 封裝後的ajax get方法 * * @param {string} url 請求路徑 * @param {object} params 請求參數 * @param {object} config 使用者自訂設定 * @returns */ function post (url, params, config = {}) => {  return instance.get(url, {params}, config)}export default {    post,    get,}
隊列應用

隊列一般結合函數防抖使用,在盡量減少請求次數的情況下,避免傳回值順序的錯誤

$(input).on(‘input‘, evt => {    // 在使用者不斷的輸入過程中,當暫停輸入100ms才發起ajax,在發起ajax的同時,中斷上一個查詢keyword的ajax    debounce(()=>{        get(‘http://baidu.com‘, {keyword: evt.target.value})    })})// 定義一個防抖函數function debounce(fn, step = 100) {    let timeout = null;    return function () {        clearTimeout(timeout);        timeout = setTimeout(() => {            fn.apply(this, arguments);        }, step);    };}

axios封裝(二)-隊列管理

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.