Baconjs仅返回最后的去抖值

时间:2017-10-30 11:42:14

标签: javascript node.js events frp bacon.js

以下是代码示例:

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方法吗?

1 个答案:

答案 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核心。