以下是代码示例:
let watcher;
const streamWatcher = bacon.fromBinder(sink => {
watcher = chokidar.watch(root, {
ignored: /(^|[\/\\])\../
});
watcher.on('all', (event, path) => {
sink({
event: event,
path: path
});
return () => {
watcher.unwatch(root);
};
});
});
streamWatcher
.skipDuplicates(_.isEqual)
.map('.path')
.scan([], (a, b) => {
a.push(b);
return a;
})
.debounce(300)
.onValue(files => {
if (files.length) {
console.log('change event fired');
tinyLrSrv.changed({
body: {
files: files
}
});
}
});
我想要做的是使用chokidar观看文件夹更改(正在开发的网站目录),然后使用Bacon.js
进行包装和去抖(因为我不想知道每个文件的更改,只需批量告诉我)并返回更改的文件数组。
问题是 - 数组是从头开始的,所以每次文件更改时,它都会不断添加到原始数组中。
我想得到的是最后更改的文件数组,换句话说,每次onValue
接收数组时,保存数组的变量都需要重置。
有没有纯粹的bacon.js方法吗?
答案 0 :(得分:0)
想不出一个超级“纯粹”的方式来做得很好。您是否注意到您实际上在scan
中改变了缓冲区?您可以利用它并实际清除onValue
代码中的缓冲区。记得在发送到tinyLrSrv时克隆缓冲区。另一种方法是使用变量:
var files = []
streamWatcher.skipDuplicates(_.isEqual).map('.path')
.doAction(a => files.push(a))
.debounce(300)
.onValue(() => {
if (files.length) {
timyLrSrv.changed({body: {files}})
files = []
}
})
我自己也有类似的问题,并没有找到一个很好的“纯粹”方式来做到这一点。请提交针对Bacon.js的问题,我们可以弄清楚是否应该添加到Bacon.js核心。