Vue如何处理Axios多次请求数据显示问题

目录
  • Vue处理Axios多次请求数据显示
    • 服务端代码
    • 客户端代码
  • vue axios多次请求一个接口取消前面请求
    • 方法一
    • 方法二
  • 总结

Vue处理Axios多次请求数据显示

场景:

一个搜索框,要求用户输入内容改变之后立即进行搜索

遇到的问题:

用户频繁的进行搜索词修改,会触发很多次搜索请求,如果请求有延时,就会出现显示不正确的现象

比如下面这个例子:

  • 请求1发出后,存在延时大,响应1后返回;
  • 请求2发出后,延时小,响应2先返回;
  • 最后显示的内容是响应1;

而我期待的显示内容,是最后一次的请求结果响应2

请求1 -------> 延时 ---------> 响应1
     请求2 -> 延时 -> 响应2

服务端代码

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():
    # 模拟网络延时
    sleep = random.random() * 2

    time.sleep(sleep)

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

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

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

客户端代码

1、直接请求,会出现数据显示不对的情况

<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;
    },

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

  },
};
</script>

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

2、增加一个定时器

import axios from 'axios';

export default {
  name: '',

  data() {
    return {
      result: '',
      timer: null, // 定时器
    };
  },

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

      const res = await this.searchForTimeout(keyword);

      this.result = res.data;
      
    },

    // 加定时器:会有一个延迟,如果有超过500ms的网络延时,也会出现数据不一致
    async searchForTimeout(keyword) {
      return new Promise((resolve, reject) => {
        // 清除没执行的timer定时器
        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、加请求时间戳

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, // 相当于版本号
    };
  },

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

      const res = await this.searchForTimestamp(keyword);

      // 如果时间戳大于当前记录的时间戳则更新数据
      if (res.data.timestamp > this.timestamp) {
        this.timestamp = res.data.timestamp;
        this.result = res.data;
      }
    },

    // 加请求时间戳:类似乐观锁
    async searchForTimestamp(keyword) {
      return instance.get('http://127.0.0.1:5000/search', {
        params: { keyword: keyword },
      });
    },
  },
};

vue axios多次请求一个接口取消前面请求

方法一

    var CancelToken = axios.CancelToken;
    var source = CancelToken.source(); // 每次调用接口之前都赋值一下 不然不会触发请求
    axios.get('/user/12345', {//get请求在第二个参数
     cancelToken: source.token
    }).catch(function(thrown) {
    });
    axios.post('/user/12345', {//post请求在第三个参数
     name: 'new name'
    }, {
     cancelToken: source.token
    });
    source.cancel('不想请求了');

方法二

const CancelToken = axios.CancelToken;
let cancel;
 
axios.get('/user/12345', {
  cancelToken: new CancelToken(function executor(c) {
    // executor 函数接收一个 cancel 函数作为参数
    cancel = c;
  })
});
 
// cancel the request
cancel();

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • vue axios接口请求封装方式

    目录 vue axios接口请求封装 总结 vue axios接口请求封装 简易记录一下最近用到的比较顺手的.axios接口请求的封装 1.新建network文件夹,其内新建request.js 设置一个 baseURL ,便于为axios实例传递相对url 2.新建api文件夹,其内新建index.js.home.js index.js主要是为了便于导出可能有多个页面相关的请求 home.js中主要封装有关home页的请求操作,这里名字随便取即可 3.在main.js中导入/api/index

  • Vue中的计算属性和axios基本使用回顾

    目录 1. 什么是计算属性 2. 计算属性的特点 计算属性 3. 如何声明计算属性 4. 计算属性的使用注意点 5. 计算属性 vs 方法 6. axios axios的基本使用 总结 1. 什么是计算属性 计算属性本质上就是一个function 函数,它可以实时监听data 中数据的变化,并 return 一个计算后的新值,  供组件渲染 DOM 时使用. 计算属性指的是通过一系列运算之后,最终得到一个属性值. 这个动态计算出来的属性值可以被模板结构或methods 方法使用. 示例代码如下:

  • Vue封装axios的示例讲解

    1.axios:是一个基于Promise的网络请求库.既可以在node.js(服务器端)使用,也可以在浏览器端使用 (1)在node.js中使用的原生的http模块 (2)在浏览器中使用的XMLHttpRequest 2.vue中的使用方法 (1)安装:npm install axios (2)引用方法: 原生的方式(不推荐使用) axios({ url:'http://127.0.0.1:9001/students/test', //远程服务器的url method:'get', //请求方式

  • Vue Axios异步与数据类型转换问题浅析

    目录 axios 请求中异步与否问题 不使用异步的例子 使用异步的例子 对象与数组转换 axios 请求中异步与否问题 众所周知,axios 请求有些请求需要配合异步函数来实现,我大概总结了两种适配场景: 不使用异步:后端响应值对后续操作无影响,我们仅需要判断这个请求是否成功的情况下 使用异步:我们需要存储后端响应值并使用它进行某些渲染操作 不使用异步的例子 参考我们上一节的最后一块,我们抽离了登录校验的 axios 请求,这是具体代码 可见,我们只需要把本地 token 传递给后端,经过后端

  • 浅谈Vue知识系列-axios

    目录 axios基础知识 axios应用场景 axios基础知识 axios是独立于vue的一个项目,基于promise用于浏览器和node.js的http客户端. 在浏览器中可以帮助我们完成ajax请求的发送在node.js中可以向远程接口发送请求 axios应用场景 axios的使用 第一步:创建html文件,在body中引入两个js文件: <script src="vue.min.js"></script> <script src="axi

  • Vue.js axios响应拦截如何获取返回状态码

    目录 axios响应拦截获取返回状态码方式整理 方法一 方法二 方法三 Vue的axios拦截器用法 总结 axios响应拦截获取返回状态码方式整理 方法一 axios.interceptors.response.use( response => { console.log('拦截器响应成功') return response }, error => { console.log('拦截器响应失败') console.log(error) if(error.request){ console.l

  • Vue如何处理Axios多次请求数据显示问题

    目录 Vue处理Axios多次请求数据显示 服务端代码 客户端代码 vue axios多次请求一个接口取消前面请求 方法一 方法二 总结 Vue处理Axios多次请求数据显示 场景: 一个搜索框,要求用户输入内容改变之后立即进行搜索 遇到的问题: 用户频繁的进行搜索词修改,会触发很多次搜索请求,如果请求有延时,就会出现显示不正确的现象 比如下面这个例子: 请求1发出后,存在延时大,响应1后返回: 请求2发出后,延时小,响应2先返回: 最后显示的内容是响应1: 而我期待的显示内容,是最后一次的请求

  • Vue中Axios中取消请求及阻止重复请求的方法

    目录 阻止请求目的: 常见情况: 新建 axios.js 文件 全局 main.js 引入 阻止请求目的: 为了防止用户在网络不好或者其他情况下短时间内重复进行接口请求,从而导致前端向后端重复发送多次请求. 常见情况: PC端:输入框搜素,多次请求接口移动端:移动端很容易造成误操作或多操作请求(移动端没有点击延迟)注意:有Loading遮罩时也有可能发生重复请求 新建 axios.js 文件 import axios from "axios"; // import router fro

  • Vue取消Axios发出的请求

    目录 一.前言 二.AbortController 三.CancelToken 一.前言 有的时候我们需要取消axios发出的请求,例如在退出页面时,取消掉仍然在进行的请求. 二.AbortController mdn中AbortController的介绍. 从 v0.22.0 开始,Axios 支持以 fetch API 方式—— AbortController 取消请求: const controller = new AbortController(); axios.get('/foo/ba

  • vue使用axios跨域请求数据问题详解

    axios默认是没有jsonp 跨域请求的方法的.一般来说流行的做法是将跨域放在后台来解决,也就是后台开发人员添加跨域头信息. 例如java中的 header,response.setHeader("Access-Control-Allow-Origin", www.allow-domain.com) 但是很多时候,后台出于一些原因不想修改或者已经写好jsonp的接口需要适应不同平台,此时,前端就可以单独引入依赖解决该问题了. 引入依赖 cnpm install jsonp 导入到vu

  • Vue使用axios出现options请求方法

    以下代码如果需要在你本地跑起来: Ⅰ.需要apache服务,并把php代码丢进去指定位置 Ⅱ.将下面http://www.test.com/day05/jiekou.php地址,改成自己指定位置的域名或ip 1.从一段简易代码说起 前端代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewpor

  • vue使用Axios做ajax请求详解

    vue2.0之后,就不再对vue-resource更新,而是推荐使用axios 1. 安装 axios $ npm install axios 或 $ bower install axios 2. 在要使用的文件中引入axios import axios from 'axios' 3. 使用axios做请求 可以通过向 axios 传递相关配置来创建请求, 只有 url 是必需的.如果没有指定 method,请求将默认使用 get 方法. { // `url` 是用于请求的服务器 URL url

  • 详解Vue用axios发送post请求自动set cookie

    vue-resource不再维护之后,我也用起了axios,但是死活无法设置服务器发送过来的cookie 后来查询文档发现,这个是要单独配置的. // `withCredentials` indicates whether or not cross-site Access-Control requests // should be made using credentials withCredentials: false, // default 当我们把此配置项设置成默认配置项并且设置成true

  • Vue 2.5.2下axios + express 本地请求404的解决方法

    最近在学习Vue,今天尝试了使用axios模拟本地网络请求.使用的过程中发现接口请求一直404,后来发现在当期的Vue-cli构建的最新的项目中,接口请求应该这样写. 1.引入相关依赖 var axios = require('axios') const express = require('express'); var app = express(); var apiRoutes = express.Router(); app.use('/api', apiRoutes); 2.处理网络请求

  • 完美解决axios跨域请求出错的问题

    错误信息: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:9000' is therefore not allowed access. The response had HTTP status code 403

  • axios发送post请求springMVC接收不到参数的解决方法

    axios发送post请求时,出现了参数后台接收不到的情况,分析了下请求,发现是请求头content-type不对,是application/json,正常应该是application/x-www-form-urlencoded. 解决方法有以下三种: 1.设置axios的默认请求头 //设置全局的 axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'; var instance = a

随机推荐