三种全局部署方法实现防抖

36 篇文章 0 订阅
2 篇文章 0 订阅

方法1:axios

利用了axios拦截器,每次请求拦截的时候,检查请求的地址在不在list里,不在的话才允许发请求并把这次请求的地址存下来,在的话不允许发请求。每次响应拦截的时候,从list里去除这次请求地址。
附加功能:1、部署了getpost方法,简化使用。2、请求成功的时候,延缓2秒去除,即请求成功了就不许再发请求了。
坑点:在请求拦截时去除掉的请求也会进入响应拦截,因此要区别处理。

//文件:api/http.js
import axios from 'axios'
 
axios.defaults.timeout = 5000;                        //响应时间
axios.defaults.baseURL = 'http://localhost:3000';   //配置接口地址

let reqList = []

/**
 * 阻止重复请求
 * @param {array} reqList - 请求缓存列表
 * @param {string} url - 当前请求地址
 * @param {function} cancel - 请求中断函数
 * @param {string} errorMessage - 请求中断时需要显示的错误信息
 */
 const stopRepeatRequest = function (reqList, url, cancel, errorMessage) {
  const errorMsg = errorMessage || ''
  for (let i = 0; i < reqList.length; i++) {
    if (reqList[i] === url) {
      cancel(errorMsg)
      return
    }
  }
  reqList.push(url)
}
/**
 * 允许某个请求可以继续进行
 * @param {array} reqList 全部请求列表
 * @param {string} url 请求地址
 */
 const allowRequest = function (reqList, url) {
  for (let i = 0; i < reqList.length; i++) {
    if (reqList[i] === url) {
      reqList.splice(i, 1)
      break
    }
  }
}
 
//POST传参序列化(添加请求拦截器)
axios.interceptors.request.use((config) => { //在发送请求之前做某件事
  // //携带请求头
  // let token = window.localStorage.getItem("accessToken")
  // console.log("token:"+token);
  // config.headers.accessToken = token;//下面两种方式都行
  // // config.headers['accessToken'] = token

  // 设置cancelToken对象
  let cancel
  config.cancelToken = new axios.CancelToken(c => cancel = c)
  // 阻止重复请求。当上个请求未完成时,相同的请求不会进行
  stopRepeatRequest(reqList, config.url, cancel, `${config.url} 请求被中断`)

  return Promise.resolve(config)
},(error) =>{
  return Promise.reject(error)
});
 
//返回状态判断(添加响应拦截器)
axios.interceptors.response.use((res) =>{ //对响应数据做些事
  // 增加延迟,相同请求不得在短时间内重复发送
  setTimeout(() => {
    allowRequest(reqList, res.config.url)
  }, 1000)

  return Promise.resolve(res)
}, (error) => { 
  if (axios.isCancel(error)) { // 区分错误是因为被防抖阻止还是404
    console.log(error.message)
  }else{
    // 取消了延迟,相同请求不得在短时间内重复发送,除非上一次的请求404了
    allowRequest(reqList, error.config.url)
  }
  return Promise.reject(error)
})
 
//返回一个Promise(发送post请求)
export function fetchPost(url, params) {
  return new Promise((resolve, reject) => {
    axios.post(url, params)
      .then(response => {
        resolve(response)
      }, err => {
        reject(err)
      })
      .catch((error) => {
        reject(error)
      })
  })
}
// 返回一个Promise(发送get请求)
export function fetchGet(url, param) {
  return new Promise((resolve, reject) => {
    axios.get(url, {params: param})
      .then(response => {
        resolve(response.data)
        try{console.log(response.data)}
        catch{console.log('无数据')}
      }, err => {
        reject(err)
      })
      .catch((error) => {
        reject(error)
      })
  })
}
export default {
  fetchPost,
  fetchGet,
}
//文件:main.js
+++++++++
import {fetchPost, fetchGet} from '@/api/http'

Vue.prototype.post = fetchPost;
Vue.prototype.get = fetchGet;
//文件:App.vue
++++++
this.get('/posts/1').then(() => {}).catch(() => {})

方法2:element组件

使用el-button的loading属性, 如果使用loading 属性, 通常 我们会在vue的data中定义一个loading变量,然后调用ajax之前将loading设置为true, ajax返回后将loading设置为false. 这是比较合理的办法,但是如果一个系统非常多这种情况, 那我们需要每一个页面都去定义一个loading变量,作为一个合格的程序员,我们当然想不要写这么多重复的代码,这时候就需要对el-button做二次封装了

附加功能:1、二次封装了el-button

//文件:el-el-button
<template>
<!-- v-bind=$attrs,这个表示是继承所有父组件传过来的属性,用了这个属性,我们可以将el-button的所有的props都能继承 -->
  <el-button v-bind="$attrs" :loading="loadingStatus" @click="handleClick">
    <slot/>
  </el-button>
</template>
    
<script>
export default {
  name: 'el-el-button',
  props: {
    autoLoading: {
      type: Boolean,
      default: false
    }
  },
  data() {
    return {
      loadingStatus: false
    }
  },
  methods: {
    handleClick() {
      if (this.autoLoading) {
        this.loadingStatus = true
      }
    //  控制loading消失,在业务组件上处理好业务逻辑以后后执行这个回调函数,就能消失loading了
      this.$emit('click', () => {
        this.loadingStatus = false
      })
    }
  }
}
</script>

<style>

</style>
</script>

<style>

</style>
//文件:App.vue
++++++
<el-el-button :auto-loading="true" @click="submit">自动loading按钮</el-el-button>
++++++
   submit(done) {
    // 这里供业务组件处理一些事情,比如ajax请求,此处用setTimeout模拟,    执行done()方法消失loading
      setTimeout(() => {
        done()
      }, 1000)
    },
//文件:index.js
import button from './button.vue';

const components = [button]

const elEl = {
    install:function(Vue) {
        components.forEach(component => {
          Vue.component(component.name, component);
        })
    }
}

export default elEl;
//文件;main.js
++++++
import elEl from '@/components/elEl/index.js'

Vue.use(elEl);

方法3:全局指令

加一个指令,这个指令做到提交以后禁用按钮一段时间,防止重复提交。这里也做了全局部署

//文件:noMoreClick.js
const noMoreClick = {
    name:'noMoreClick',
    inserted(el) {
        el.addEventListener('click', () => {
            el.classList.add('is-disabled')
            el.disabled = true
            setTimeout(() => {
                el.disabled = false
                el.classList.remove('is-disabled')
            }, 2000)
        })
    }
}

export default noMoreClick
文件:index.js
import noMoreClick from './packge/noMoreClick.js'

const arr = [noMoreClick]

const utils = {
    install:function(Vue) {
        arr.forEach(e => {
          Vue.directive(e.name, e);
        })
    }
}


export default utils;
//文件main.js
import directive from '@/directive/index.js'
++++++++
Vue.use(directive);
//文件:App.vue
<el-button v-no-more-click>确 定</el-button>

参考:

2.https://juejin.cn/post/6916474993635229704
3.https://juejin.cn/post/6948621847239852062

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
移动机器人的全局路径规划方法是指在未知的环境中,通过对环境地图的分析和规划,使移动机器人能够找到一条从起始点到目标点的最优路径。要实现移动机器人的全局路径规划方法,可以利用Matlab软件来进行开发和实现。 首先,我们需要获取移动机器人所在环境的地图数据,可以是二维或三维的地图数据。然后,可以利用Matlab中的图像处理和数据处理工具箱对地图数据进行处理和分析,将地图数据转换成适合规划算法处理的形式。 接下来,可以选择合适的全局路径规划算法,例如Dijkstra算法、A*算法或者其他启发式搜索算法。利用Matlab编程语言来实现选定的路径规划算法,并根据地图数据和移动机器人的起始点和目标点进行路径规划。 在实现路径规划算法的过程中,还可以结合地图的障碍物信息和避障算法,确保规划出的路径能够避开障碍物并且是可行的最优路径。通过Matlab的可视化工具,可以将规划出的路径在地图上进行显示和优化,使路径规划过程更直观和可理解。 最后,可以将实现好的全局路径规划方法与移动机器人的控制系统进行集成,实现移动机器人在未知环境中自主规划并执行路径的功能。通过Matlab的仿真工具,可以对路径规划算法和系统的性能进行评估和优化。 总而言之,利用Matlab可以较为方便地实现移动机器人的全局路径规划方法,并且可以进行仿真和调试,为移动机器人的自主导航提供强有力的支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值