添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

lodash 中的节流函数 throttle 和防抖函数 debounce 官方文档是这样定义的:

_.throttle(func, [wait=0], [options=])

func (Function): 要节流的函数。 [wait=0] (number): 需要节流的毫秒。 [options=] (Object): 选项对象。 [options.leading=true] (boolean): 指定调用在节流开始前。 [options.trailing=true] (boolean): 指定调用在节流结束后。 (Function): 返回节流的函数。

_.debounce(func, [wait=0], [options=])

func (Function): 要防抖动的函数。 [wait=0] (number): 需要延迟的毫秒数。 [options=] (Object): 选项对象。 [options.leading=false] (boolean): 指定在延迟开始前调用。 [options.maxWait] (number): 设置 func 允许被延迟的最大值。 [options.trailing=true] (boolean): 指定在延迟结束后调用。 (Function): 返回新的 debounced(防抖动)函数。

把一个带参数的函数转化为节流和防抖版本的,如何保证传参可行。在使用Vue开发时,如何转换节流和防抖函数。现有的情形描述一下就是,有个button的 click 事件,目前 click 事件的回调函数是带参数的,而且参数不能省,如何将这个回调函数转换为节流或者防抖版本的。

<el-button @click="handleOnSale(scope.row)"/>
async handleOnSale(row) {
 if (row.isOnShelf === 0) {
    try {
      await this.$confirm('确定要上架吗?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
    } catch (e) {
      console.log(e)
      return
    try {
      const topic = Object.assign({}, { isOnShelf: 1, topicKey: row.topicKey })
      const res = await this.$api.knowledge.updateTopic(topic)
      if (res && res.code === 0) {
        this.$message({
          message: '上架成功',
          type: 'success'
        setTimeout(() => {
          this.pagination.current = 1
          this.tableReload(this.formSearch)
        }, 2000)
    } catch (e) {
      console.log(e)
  if (row.isOnShelf === 1) {
    try {
      await this.$confirm('确定要下架吗?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
    } catch (e) {
      console.log(e)
      return
    try {
      const topic = Object.assign({}, { isOnShelf: 0, topicKey: row.topicKey })
      const res = await this.$api.knowledge.updateTopic(topic)
      if (res && res.code === 0) {
        this.$message({
          message: '下架成功',
          type: 'success'
        setTimeout(() => {
          this.pagination.current = 1
          this.tableReload(this.formSearch)
        }, 2000)
    } catch (e) {
      console.log(e)

理解节流和防抖函数的使用

要想使用节流或者防抖函数,需要传递一个纯函数,即不带参数的函数(其实是不带括号的函数),这里需要指出带参和不带参(不带括号)的区别:

function foo(){}
function bar(a,b){}
console.log(typeof foo) //function
console.log(typeof bar) //function
console.log(typeof bar(1,2)) //undefined

通过typeof运算,可以看出,如果一个函数是带参的,会判断为undefined,原理是函数本质是一个地址,函数调用是一个返回结果,如果一个函数带参(其实就是带括号了,参数没有都可以)了,会解释为函数调用,如果函数没有返回值,typeof就是undefined,如果有返回值,typeof就是返回值的类型

function bar(a,b){return false}
console.log(typeof bar(1,2)) //boolean

那如果函数必须要带参数,如何使用节流和防抖呢?

其实,只要传递函数名称就可以了,不要带参(带括号)就行了。譬如:

function bar(a,b){return false}
let throttleBar = _.throttle(bar,2000,{leading:true,trailing:false})
let debounceBar = _.debounce(bar,2000,{leading:true,trailing:false})

这样throttleBardebounceBar就是节流和防抖版本的bar函数了,调用时,

throttleBar(1,2)
debounceBar(1,2)

Vue中如何对绑定的事件回调函数转换为节流或者防抖

正如我们现实情况遇到的,绑定的click事件回调函数,里面涉及异步操作,特别的我们使用了async语法,那么回调函数本质是一个promise function而不是function,而 _.throttle(func, [wait=0], [options=])、 _.debounce(func, [wait=0], [options=])都要求入参funcfunction,所以需要将promise function类型转换为function类型,为此可以想到这样做:

handleOnSaleFun(row) {
  this.handleOnSale(row)

另外,节流和防抖函数转换,需要提前转换,也就是在绑定回调函数时,回调函数需要提前转换为节流和防抖版本,否则节流和防抖不会生效。

<el-button @click="_.debounce(handleOnSaleFun, 2000, { leading: true, trailing: false })"/>

这样的方式不行,因为参数必须要传递

<el-button @click="_.debounce(handleOnSaleFun, 2000, { leading: true, trailing: false })(scope.row)"/>

这样也不行,事件绑定回调也是纯函数,不是函数调用

<el-button @click="debounceHandleOnSaleFun(scope.row)"/>
computed: {
  debounceHandleOnSaleFun() {
    return _.debounce(this.handleOnSaleFun, 2000, { leading: true, trailing: false })

利用计算属性得到一个防抖或者节流版本的函数,这样的函数其实就是纯函数,在事件的回调函数中,传递参数不会解释为函数调用,而是带参的函数,这样就实现了带参函数的防抖和节流。

非前端开发工程师,往往因为缺少css编写经验而很难写出组织良好且易于维护的css代码项目 Less介绍 Less是一门css预处理语言,它扩展了css的动态特性。在css的基础上引入了变量、运算、函数等功能。 常见的预处理器:Sass、Less、Stylus Less安装 首先需要安装node.js 使用npm install -g less安装less 使用less -v Python函数编程的map(func, seq1[, seq2,…]) 函数是将func作用于seq的每一个元素,其seq须是可迭代对象,并将所有的用的结果作为一个list返。如果func为None,作用同zip()。 本文参考自:Pythonmap()函数浅析一文,感谢精彩分享。 下面举得例子来帮助我们更好的理解这个工作过程: 1、对可迭代函数’iterable’的每一个元 在 Python 函数是一种可重用的代码块,用于执行特的任务或操作。函数可以接受输入参数,并返输出结果,从而实现模块化和封装性编程的目的。""""""其,def是函数的关键字,是函数的名称,parameters是函数的参数列表,用圆括号包裹,多个参数之间用逗号分隔,如果没有参数,则留空即可。函数名称和参数列表组成了函数的签名(signature),用于唯一识别和用该函数函数的主体部分由冒号和缩进的代码块组成,通常包含一些语句和表达式来完成具体的计算或操作。 Hive内置函数一 Hive函数分类二 字符函数二 类型转换函数和数学函数三 日期函数四 集合函数五 条件函数六 聚合函数和表生成函数6.1 聚合函数6.2 表生成函数:输出可以作为表使用 一 Hive函数分类 从输入输出角度分类 标准函数:一行数据的一列或多列为输入,结果为单一值 聚合函数:多行的零列到多列为输入,结果为单一值 表生成函数:零个或多个输入,结果为多列或多行 从实现方式分类 内置函数函数 UDF:自义标准函数 UDAF:自义聚合函数 UDTF:自义表生成函数 __func__标识符  __func__是C99标准里面预义标识符, 它是一个static const char[], 会在每一个使用__func__的函数里隐式义.下面是ISO9899里的例子#include void myfunc(void){     printf("%s/n", __func__);     /* ... */}输出: myfunc 据我所知好像只 函数义以关键字def开头,后面接函数名称和圆括号。括号放入函数需要的参数。通过冒号和缩进控制函数内容。def 函数名(参数) : 函数体在学习一门语言时,我们最先学会的是如何输出Hello world。那么,我们的第一个函数也就从最简单的输出Hello world开始。') hello()可以看到,我们用了我们义的hello函数函数执行了其的print语句。这里我们义一个可以计算两个数之和的函数add,可以先运行一下看看。3函数完美地计算出了1加2的值。 主要有cv2.line()//画线, cv2.circle()//画圆, cv2.rectangle()//长方形,cv2.ellipse()//椭圆, cv2.putText()//文字绘制 img:源图像 color:需要传入的颜色 thickness:线条的粗细,默认值是1 linetype:线条的类型,8 连接,抗锯齿等。默... 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 () 任何传入参数和自变量必须放在圆括号间,圆括号之间可以用于义参数。 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。 函数内容以冒号起始,并且缩进。 return [表达...