去抖观察者
我得出的一个解决方案是(a)需要有一个解决问题的方法,(b)需要有一个解决方案来确保多个快速Ctrl+s
操作不会导致竞争条件。这就是我所拥有的...
./**/utilities.js
(某处)
export default {
...
debounce(fn, delay) { // #thxRemySharp https://remysharp.com/2010/07/21/throttling-function-calls/
var timer = null;
return function execute(...args) {
var context = this;
clearTimeout(timer);
timer = setTimeout(fn.bind(context, ...args), delay);
};
},
...
};
./**/file.js
(别处)
import utilities from './**/utilities.js'; // somewhere
...
function watch(server) {
const debounced = utilities.debounce(observeFilesystem.bind(this, server), 1000 * 0.25);
const observers = new Set()
.add( fs.watch('./src', debounced) )
.add( fs.watch('./index.html', debounced) )
;
console.log(`watching... (${observers.size})`);
return observers;
}
function observeFilesystem(server, type, filename) {
if (!filename) console.warn(`Tranfer Dev Therver: filesystem observation made without filename for type ${type}`);
console.log(`Filesystem event occurred:`, type, filename);
server.close(handleClose);
}
...
这样,我们传入的观察处理程序fs.watch
是 [在这种情况下是一个绑定的 bunction],如果多个调用彼此相隔不到几秒(250 毫秒),它就会被去抖动。1000 * 0.25
值得注意的是,我还设计了一个Promise
s 管道来帮助避免其他类型的竞争条件,因为代码还利用了其他回调。另请注意 Remy Sharp 的贡献,其去抖动功能多年来一再证明非常有用。