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

JavaScript如何實現(xiàn)防止重復的網(wǎng)絡請求的示例

 更新時間:2021年01月28日 09:35:56   作者:Daes  
這篇文章主要介紹了JavaScript如何實現(xiàn)防止重復的網(wǎng)絡請求的示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

前言

在開發(fā)中,經(jīng)常會遇到接口重復請求導致的各種問題。
對于重復的網(wǎng)絡請求,會導致頁面更新多次,發(fā)生頁面抖動的現(xiàn)象,影響用戶體驗。
例如當前頁面請求還未響應完成,就切換到其他路由,那么這些請求直到響應返回才會中止。
無論從用戶體驗或者從業(yè)務嚴謹方面來說,取消無用的請求確實是需要避免的。

實現(xiàn)思路

**  1.在發(fā)送請求前先攔截當前請求地址 (url + 方法 + 參數(shù));
**  2.開啟一個請求隊列用于保存 當前地址;
**  3.每次請求查看請求隊列里面有沒有當前url地址;
**  4.如果請求隊列里有當前url地址就取消當前請求,
**  5.如果沒有就發(fā)送請求,當請求數(shù)據(jù)返回后,請求隊列里清除當前url地址。

1.平時我們寫接口是這樣的:

請求接口文件

import { http } from '@/plugin/axios'; // 導入請求接口 http

// 初始化
export function getInit(params) {
  return http({
    method: 'get',
    url: '/xxx/xxx/xx',
    params,
  });
}

主要就是這里執(zhí)行 http方法的時候做操作;
執(zhí)行http函數(shù)的時候能獲取到請求所有配置 config ,返回promise對象。

2.這里演示使用axios,思路是執(zhí)行請求函數(shù)的時候外面包一層

axios.js配置文件

import axios from 'axios';
import { httpRequest, completeRequest } from './options'; // 這里就是我們要實現(xiàn)的邏輯文件

// 里面做一些請求攔截,響應攔截操作 具體查看axios文檔
const service = axios.create({
  baseURL: 'xxx/xxx',
});

// 請求攔截器
service.interceptors.request.use(config => {}, error => {})

// 響應攔截器
service.interceptors.response.use(response => {
 completeRequest(response); // 2.響應請求回來執(zhí)行
}, error => {
 
})

export function http(config) { // => 這里config就是傳遞的請求配置參數(shù)
  return httpRequest(config, service); // + 1.在這里做一些邏輯操作
}

3.防止重復網(wǎng)絡配置文件

options.js
(1)發(fā)送請求前,查看請求隊列里是否有當前請求(url地址來判斷)

  • 請求隊列有當前url地址, 取消請求  返回promise.reject失敗
  • 沒有當前請求,正常發(fā)送請求;
/**
 * 職責: 防止重復的網(wǎng)絡請求
 *
 */

let list = new Set(); // 1.請求隊列

// 合并 方法 參數(shù) url地址
function getUrl(config = {}) {
 // get請求 params參數(shù) post請求 data參數(shù), baseURL
 const { url, method, params, data, baseURL = '' } = config;
 const urlVal = url.replace(baseURL, '');
 return `${urlVal}?${method === 'get' ? getformatObjVal(params) : getformatObjVal(data)}`;
}

// 處理 url地址 
const getformatObjVal = (obj) => {
 obj = typeof obj === 'string' ? JSON.parse(`${obj}`) : obj;
 var str = [];
 for (let p in obj) {
  if (obj.hasOwnProperty(p) && p !== '_t') {
   var item = obj[p] === null ? '' : obj[p]; // 處理null
   str.push(encodeURIComponent(p) + '=' + encodeURIComponent(item));
  }
 }
 return str.join('&');
}

// 2.請求方法
export function httpRequest(config = {}, axios) {
 const url = getUrl(config); //3. 這里我們獲取到了URL地址

 if (list.has(url)) { // 4.查看請求隊列是否有當前url地址
  return Promise.reject('In the request'); // 5.在請求隊列里面 取消當前請求, 返回Promise失敗結(jié)果
 }
 
 // 6. 請求隊列沒有當前url地址 發(fā)送請求并把url地址存入請求隊列里
 list.add(url);
 return Promise.resolve(axios); 
}

(2)請求響應回來后,在請求隊列里刪除當前url地址; (下一次請求就可以正常發(fā)送)
​ options.js

// 請求響應回來執(zhí)行這個函數(shù)
export function completeRequest(response = {}) {
 const { config } = response; // 1.response里面config能拿到配置參數(shù)
 const url = getUrl(config); // 2.獲取url地址 
 if (list.has(url)) {
  list.delete(url); // 3.刪除請求隊列中的當前請求url地址
 }
}

axios.js

import axios from 'axios';
import { httpRequest, completeRequest } from './options'; // 防止重復請求

const service = axios.create({
  baseURL: 'xxx/xxx',
});

// 請求攔截器
service.interceptors.request.use(config => {}, error => {})

// 響應攔截器
service.interceptors.response.use(response => {
 completeRequest(response); // 2.響應請求回來執(zhí)行 +
}, error => {
 
})


// 導出請求
export function http(config) {
  return httpRequest(config, service); // 1.發(fā)送請求前執(zhí)行
}

到這里已經(jīng)實現(xiàn)了防止重復的網(wǎng)絡請求,但還有一個問題,響應請求發(fā)生異常了要清除請求隊列中當前url地址。不清理,下一次發(fā)送請求直接被取消掉 (這里我就隨便寫了一個方法,把請求隊列全部清空,大家可以按自己場景來寫)。

/**
 * 清空所有請求隊列
 */
export function clearRequestList() {
 list = new Set(); // 這里我就直接清空了
}

完整http.js文件

import axios from 'axios';
import { httpRequest, completeRequest, clearRequestList } from './options'; // 防止重復請求 +

const service = axios.create({
  baseURL: 'xxx/xxx',
});

// 請求攔截器
service.interceptors.request.use(config => {}, error => {})

// 響應攔截器
service.interceptors.response.use(response => {
 completeRequest(response); // 2.響應請求回來執(zhí)行
}, error => {
 clearRequestList(); // + 
})


// 導出請求
export function http(config) {
  return httpRequest(config, service); // 1.發(fā)送請求前執(zhí)行
}

完整options.js

/**
 * 職責: 防止重復的網(wǎng)絡請求
 *
 */

let list = new Set(); // 1.請求隊列

// 合并 方法 參數(shù) url地址
function getUrl(config = {}) {
 // get請求 params參數(shù) post請求 data參數(shù), baseURL
 const { url, method, params, baseURL = '' } = config;
 const urlVal = url.replace(baseURL, '');
 return `${urlVal}?${method === 'get' ? getformatObjVal(params) : 'post'}`;
}

// 處理 url地址 
const getformatObjVal = (obj) => {
 obj = typeof obj === 'string' ? JSON.parse(`${obj}`) : obj;
 var str = [];
 for (let p in obj) {
  if (obj.hasOwnProperty(p) && p !== '_t') {
   var item = obj[p] === null ? '' : obj[p]; // 處理null
   str.push(encodeURIComponent(p) + '=' + encodeURIComponent(item));
  }
 }
 return str.join('&');
}

// 2.請求方法
export function httpRequest(config = {}, axios) {
 const url = getUrl(config); //3. 這里我們獲取到了URL地址

 if (list.has(url)) { // 4.查看請求隊列是否有當前url地址
  return Promise.reject('In the request'); // 5.在請求隊列里面 取消當前請求, 返回Promise失敗結(jié)果
 }

 // 6. 請求隊列沒有當前url地址 發(fā)送請求并把url地址存入請求隊列里
 list.add(url);
 return Promise.resolve(axios);
}


/**
 * 請求響應回來執(zhí)行這個函數(shù)
 */
export function completeRequest(response = {}) {
 const { config } = response; // 1.response里面config能拿到配置參數(shù)
 const url = getUrl(config); // 2.獲取url地址 
 list.has(url) && list.delete(url); // 3.刪除請求隊列中的當前請求url地址
}

/**
 * 清空所有請求隊列
 */
export function clearRequestList(error) {
 // error 可以獲取到配置, 做一些操作。
 list = new Set(); // 這里我就直接清空了
}

以上就是我實現(xiàn)防止網(wǎng)絡請求的方式,之前我有使用過axios中CancelToken來進行取消請求;當會有一些問題。

  1. 需要配置請求文件,不友好,團隊開發(fā)配置也比較麻煩。
  2. 需要給每個請求都配置CancelToken。  有兩個方法使用它 具體可以參考官網(wǎng)文檔

到此這篇關于JavaScript如何實現(xiàn)防止重復的網(wǎng)絡請求的示例的文章就介紹到這了,更多相關JavaScript 防止重復的網(wǎng)絡請求內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論

连州市| 桂阳县| 沈丘县| 扬州市| 新平| 正定县| 万载县| 大新县| 尼玛县| 大石桥市| 清流县| 松滋市| 永修县| 绵阳市| 万宁市| 潜江市| 临颍县| 锡林郭勒盟| 茂名市| 武冈市| 湖南省| 沧州市| 前郭尔| 镇远县| 确山县| 隆林| 大姚县| 沙田区| 镇康县| 鄢陵县| 平陆县| 腾冲县| 四会市| 寻甸| 海南省| 遵化市| 常州市| 璧山县| 桃园市| 鲁山县| 五指山市|