javascript - 从对限制函数的所有调用中获取参数 (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 以及它提供的其他类型的功能不是很熟悉,所以我想我会联系堆栈溢出社区,看看是否有人能想出更好的方法来编写这种代码。
解决方案
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>
推荐阅读
- python - 将 SQL 数据聚合代码转换为 Python
- c# - 如何使用 C# 下载 html 网页
- javascript - Javascript 将 JSONP 数据从字符串转换为 Json 对象
- presto - 检查 Presto 值映射中是否存在键
- c - 如何在 C 中读取 CSV 文件的第一个条目?
- jupyter-notebook - 在 Kaggle 内核中,在检查 torch.cuda.is_available() 时选择了 GPU 选项,它说不可用
- django - 无法使用 Django 模板语言正确解析 URL
- javascript - 如何使用循环读取 ul 标签中的样式
- tensorflow - 如何在 Windows 10 上安装 tensorflow-node?
- android - 如何在 xamarin 本机 android 的列表视图中为项目着色