オブザーバーのデバウンス
私が到達した解決策は、(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
は[この場合はバインドされたバンクション]であり、複数の呼び出しが互いに数秒(250ms)未満で行われるとデバウンスされます。1000 * 0.25
Promise
コードが他のコールバックも利用するため、他のタイプの競合状態を回避するために、sのパイプラインも考案したことは注目に値するかもしれません。また、デバウンス機能が長年にわたって非常に有用であることが繰り返し証明されているRemySharpの帰属にも注意してください。