过去可以调用Object.observe()
任何对象,然后在修改属性时接收回调。但是,它已被弃用,我们获得了代理、getter 和 setter作为替代方案。但都不允许将侦听器附加到现有对象,该对象的引用已存储在其他地方。以这段代码为例:
const state = {};
/* BEGIN Third party code */
(function runProcessing() {
setInterval(globalState => {
if (Math.random() > 0.5) {
globalState.attr = !globalState.attr;
}
}, 1000, state);
})();
/* END Third party code */
// TODO: run some function every time state.attr is changed
有两个直接的问题:
state
被声明为 a const
,因此不能使用 Proxy 重新定义
state
通过引用传递给内部函数,因此即使state
重新定义,该函数仍将继续使用原始对象
虽然这可以通过setInterval
不断地将其state.attr
与之前版本的自身进行比较来实现,但它无法捕捉到setInterval
调用之间发生的变化,并且总是会有滞后。
是否有任何鲜为人知的方法可以实现这一目标?
Cats萌萌
相关分类