首页 > 解决方案 > 从对限制函数的所有调用中获取参数 (lodash)

问题描述

我正在修改一些批量写入的记录器逻辑。这听起来像是lodash 的油门功能的完美工作,但很快发现通过将 setTimeouts 替换为油门,代码仍然比我希望的要丑陋得多。这段代码应该给出基本的想法(函数比显示的要多一些)。

let queue = []

function write(message) {
  queue.push(message)
  scheduleFlushOfQueue()
}

const scheduleFlushOfQueue = _.throttle(function flushQueue() {
  const dataToWrite = queue.join('\n')
  queue = []
  fs.promises.appendFile(path, dataToWrite)
}, 100, { leading: false })

如您所见,我必须使用全局队列变量才能将参数从 write() 传递到 scheduleFlushOfQueue() (总)。理想情况下,我希望 _.throttle 只传递来自所有调用的参数列表,这样我就不必管理全局变量,但它不会这样做。

我对 Lodash 以及它提供的其他类型的功能不是很熟悉,所以我想我会联系堆栈溢出社区,看看是否有人能想出更好的方法来编写这种代码。

标签: javascriptlodash

解决方案


queue您可以使用工厂函数 ( )创建带有变量的闭包createWriteQueue。该函数创建queue, 并返回处理它的函数 ( scheduleFlushOfQueue, 和write):

const createWriteQueue = () => {
  let queue = []

  const scheduleFlushOfQueue = _.throttle(function flushQueue() {
    const dataToWrite = queue.join('\n')
    queue = []
    console.log(dataToWrite) // fs.promises.appendFile(path, dataToWrite)
  }, 100, { leading: false })

  return {
    write(message) {
      queue.push(message)
      scheduleFlushOfQueue()
    },
    scheduleFlushOfQueue,
  }
}

const q1 = createWriteQueue()

q1.write('a')
q1.write('b')
q1.write('c')

const q2 = createWriteQueue()

q2.write('d')
q2.write('e')
q2.write('f')
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.20/lodash.min.js" integrity="sha512-90vH1Z83AJY9DmlWa8WkjkV79yfS2n2Oxhsi2dZbIv0nC4E6m5AbH8Nh156kkM7JePmqD6tcZsfad1ueoaovww==" crossorigin="anonymous"></script>

另一种选择是创建一个执行相同操作的类。使用箭头函数this自动绑定。

class WriteQueue {
  queue = []
  
  scheduleFlushOfQueue = _.throttle(() => {
    const dataToWrite = this.queue.join('\n')
    this.queue = []
    console.log(dataToWrite) // fs.promises.appendFile(path, dataToWrite)
  }, 100, { leading: false })
  
  write = (message) => {
    this.queue.push(message)
    this.scheduleFlushOfQueue()
  }
}

const q1 = new WriteQueue()

q1.write('a')
q1.write('b')
q1.write('c')

const q2 = new WriteQueue()

q2.write('d')
q2.write('e')
q2.write('f')
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.20/lodash.min.js" integrity="sha512-90vH1Z83AJY9DmlWa8WkjkV79yfS2n2Oxhsi2dZbIv0nC4E6m5AbH8Nh156kkM7JePmqD6tcZsfad1ueoaovww==" crossorigin="anonymous"></script>


推荐阅读