keyup事件规避多次调用服务

背景:vue2.0框架

目前存在的问题

  1. 键盘每押下一次调用接口,请求频率过高,增加服务器压力
  2. 多次调用接口,响应时间短的先返回,响应顺序和请求顺序对应不上。

如下图所示:

1.png
把响应的数据打印到控制台,发现响应顺序和请求顺序不一致,第一个发起的请求是响应最慢的。导致页面展示的数据不正确

解决方案1

// search.vue
<template>
  <input id="keyword" v-model="keyword" type="text" @keyup.stop="keyup">
</template>

<script>
export default{
  data() {
    suggestList:[],
    keyword:""
  },
  methods:{
    keyup(){
      let curVal = this.keyword;
      let that = this;
      // 延迟0.5秒请求服务,记录当前的值
      this.keyUpTimeout = setTimeout(function() {
        that.suggestAjax(curVal);
      }, 500)
    },
    suggestAjax(curVal) {
      // 如果0.5秒内值没有改变,则发送请求
      if(curVal === this.keyword && this.keyword.trim().length > 0) {
        searchApi.searchSuggest(this.keyword)
        .then((res) => {
          if(data.result.code == 200) {
          this.suggestList = data.data;
          }
        })
        .catch((error) => {
          console.log(error);
        })
      }
    } 
  }
}
</script>

解决方案2

lodash官网:https://lodash.com/

Lodash提供了函数节流(throttle)、函数去抖(debounce)等。这里使用函数节流(throttle)解决上述问题。

安装Lodash

npm install lodash

使用throttle

// search.vue
<template>
  <input id="keyword" v-model="keyword" type="text" @keyup.stop="keyup">
</template>

<script>
// 引入节流函数
import { throttle } from 'lodash'
export default{
  data() {
    suggestList:[],
    keyword:""
  },
  methods:{
    // 使用节流函数,设置在0.5秒内只发一次请求
    keyup:throttle(function(){
      this.suggestAjax();
    },500),
    suggestAjax() {
      if(this.keyword.trim().length > 0) {
        searchApi.searchSuggest(this.keyword)
          .then((res) => {
            if(data.result.code == 200) {
              this.suggestList = data.data;
            }
          })
         .catch((error) => {
            console.log(error);
          });
      }             
    }
  }
}
</script>

如下图所示:发了三次请求

2.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,951评论 19 139
  • 1. 结构体和共同体的区别。 定义: 结构体struct:把不同类型的数据组合成一个整体,自定义类型。共同体uni...
    breakfy阅读 2,143评论 0 22
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,766评论 18 399
  • 一 洛城地处南方,春日里总是淅淅沥沥的下着小雨,对于常年生活在北方的顾月华来说,哪怕曾经在这里待过很长一段时间,...
    倾羲阅读 529评论 2 5
  • 《一》 倘若思培窦可里斯所言不假 个人肉体当由世间元素组成 我的死亡只不过是场平淡无奇的分合离散 我从来未曾完整的...
    死水微澜g阅读 391评论 3 2