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

Vue如何處理Axios多次請(qǐng)求數(shù)據(jù)顯示問(wèn)題

 更新時(shí)間:2023年01月19日 10:07:09   作者:彭世瑜  
這篇文章主要介紹了Vue如何處理Axios多次請(qǐng)求數(shù)據(jù)顯示問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Vue處理Axios多次請(qǐng)求數(shù)據(jù)顯示

場(chǎng)景:

一個(gè)搜索框,要求用戶(hù)輸入內(nèi)容改變之后立即進(jìn)行搜索

遇到的問(wèn)題:

用戶(hù)頻繁的進(jìn)行搜索詞修改,會(huì)觸發(fā)很多次搜索請(qǐng)求,如果請(qǐng)求有延時(shí),就會(huì)出現(xiàn)顯示不正確的現(xiàn)象

比如下面這個(gè)例子:

  • 請(qǐng)求1發(fā)出后,存在延時(shí)大,響應(yīng)1后返回;
  • 請(qǐng)求2發(fā)出后,延時(shí)小,響應(yīng)2先返回;
  • 最后顯示的內(nèi)容是響應(yīng)1;

而我期待的顯示內(nèi)容,是最后一次的請(qǐng)求結(jié)果響應(yīng)2

請(qǐng)求1 -------> 延時(shí) ---------> 響應(yīng)1
     請(qǐng)求2 -> 延時(shí) -> 響應(yīng)2

服務(wù)端代碼

server.py

# -*- coding: utf-8 -*-

from flask import Flask, request
from flask_cors import CORS
import time
import random

app = Flask(__name__)

# 允許跨域
CORS(app, supports_credentials=True)

# 路由
@app.route('/search')
def search():
    # 模擬網(wǎng)絡(luò)延時(shí)
    sleep = random.random() * 2
    
    time.sleep(sleep)

    keyword = request.args.get('keyword')

    return {'keyword': keyword, "sleep": sleep}


if __name__ == '__main__':
    app.run(debug=True)

客戶(hù)端代碼

1、直接請(qǐng)求,會(huì)出現(xiàn)數(shù)據(jù)顯示不對(duì)的情況

<template>
? <div class="">
? ? <input
? ? ? type="text"
? ? ? @input="handleInput"
? ? >{{result}}</div>
</template>

<script>
import axios from 'axios';

export default {
? name: '',

? data() {
? ? return {
? ? ? result: '',
? ? };
? },

? methods: {
? ? async handleInput(e) {
? ? ? const keyword = e.target.value;

? ? ? const res = await this.search(keyword);
? ? ? this.result = res.data;
? ? },

? ? // 直接搜索:可能顯示的不是最后一次搜索結(jié)果
? ? async search(keyword) {
? ? ? return await axios.get('http://127.0.0.1:5000/search', {
? ? ? ? params: { keyword: keyword },
? ? ? });
? ? },

? },
};
</script>

<style lang="scss" scoped>
</style>

2、增加一個(gè)定時(shí)器

import axios from 'axios';

export default {
? name: '',

? data() {
? ? return {
? ? ? result: '',
? ? ? timer: null, // 定時(shí)器
? ? };
? },

? methods: {
? ? async handleInput(e) {
? ? ??
? ? ? const keyword = e.target.value;

? ? ? const res = await this.searchForTimeout(keyword);

? ? ? this.result = res.data;
? ? ??
? ? },

? ? // 加定時(shí)器:會(huì)有一個(gè)延遲,如果有超過(guò)500ms的網(wǎng)絡(luò)延時(shí),也會(huì)出現(xiàn)數(shù)據(jù)不一致
? ? async searchForTimeout(keyword) {
? ? ? return new Promise((resolve, reject) => {
? ? ? ? // 清除沒(méi)執(zhí)行的timer定時(shí)器
? ? ? ? clearTimeout(this.timer);

? ? ? ? this.timer = setTimeout(() => {
? ? ? ? ? try {
? ? ? ? ? ? const res = axios.get('http://127.0.0.1:5000/search', {
? ? ? ? ? ? ? params: { keyword: keyword },
? ? ? ? ? ? });
? ? ? ? ? ? resolve(res);
? ? ? ? ? } catch (e) {
? ? ? ? ? ? reject(e);
? ? ? ? ? }
? ? ? ? }, 500);
? ? ? });
? ? },
? }
};

3、加請(qǐng)求時(shí)間戳

import axios from 'axios';

// 使用axios的攔截器
const instance = axios.create();

instance.interceptors.request.use(
? (config) => {
? ? config['X-Timestamp'] = new Date().getTime();
? ? return config;
? },
? (err) => {
? ? return Promise.reject(err);
? }
);

instance.interceptors.response.use(
? (res) => {
? ? res.data.timestamp = res.config['X-Timestamp'];
? ? return res;
? },
? (err) => {
? ? return Promise.reject(err);
? }
);

export default {
? name: '',


? data() {
? ? return {
? ? ? result: '',
? ? ? timestamp: 0, // 相當(dāng)于版本號(hào)
? ? };
? },

? methods: {
? ? async handleInput(e) {
? ? ? const keyword = e.target.value;

? ? ? const res = await this.searchForTimestamp(keyword);

? ? ? // 如果時(shí)間戳大于當(dāng)前記錄的時(shí)間戳則更新數(shù)據(jù)
? ? ? if (res.data.timestamp > this.timestamp) {
? ? ? ? this.timestamp = res.data.timestamp;
? ? ? ? this.result = res.data;
? ? ? }
? ? },

? ? // 加請(qǐng)求時(shí)間戳:類(lèi)似樂(lè)觀鎖
? ? async searchForTimestamp(keyword) {
? ? ? return instance.get('http://127.0.0.1:5000/search', {
? ? ? ? params: { keyword: keyword },
? ? ? });
? ? },
? },
};

vue axios多次請(qǐng)求一個(gè)接口取消前面請(qǐng)求

方法一

? ? var CancelToken = axios.CancelToken;
? ? var source = CancelToken.source(); // 每次調(diào)用接口之前都賦值一下 不然不會(huì)觸發(fā)請(qǐng)求
? ? axios.get('/user/12345', {//get請(qǐng)求在第二個(gè)參數(shù)
? ? ?cancelToken: source.token
? ? }).catch(function(thrown) {
? ? });
? ? axios.post('/user/12345', {//post請(qǐng)求在第三個(gè)參數(shù)
? ? ?name: 'new name'
? ? }, {
? ? ?cancelToken: source.token
? ? });
? ? source.cancel('不想請(qǐng)求了');

方法二

const CancelToken = axios.CancelToken;
let cancel;
?
axios.get('/user/12345', {
? cancelToken: new CancelToken(function executor(c) {
? ? // executor 函數(shù)接收一個(gè) cancel 函數(shù)作為參數(shù)
? ? cancel = c;
? })
});
?
// cancel the request
cancel();

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論

新兴县| 徐州市| 陆川县| 祁连县| 怀仁县| 奉化市| 屏南县| 华蓥市| 崇礼县| 南部县| 三台县| 邢台市| 尼勒克县| 长垣县| 通海县| 靖远县| 富宁县| 曲沃县| 黄梅县| 上高县| 惠安县| 深泽县| 延川县| 阳高县| 盐山县| 竹溪县| 西林县| 保山市| 古田县| 遵义市| 修文县| 门源| 浪卡子县| 丹寨县| 丽江市| 清新县| 钦州市| 宜兰县| 吴旗县| 中江县| 浦北县|