如何解决对JavaScript中的回调持有“弱引用”
我有一个Container
类型和DOM元素,它们反映了Container
的内容。我当前的设置如下:
class Container {
constructor(x,y) {
this.changeListeners = [];
this.x = x;
this.y = y;
}
setX(x) {
this.x = x;
this.stateChanged();
}
setY(y) {
this.y = y;
this.stateChanged();
}
stateChanged() {
for (let listener of this.changeListeners) {
listener.deref()?.containerStateChanged(this);
}
}
}
let c = new Container(1,2);
// These are DOM elements that reflect the state of c.
// They implement containerStateChanged functions.
// They may be dynamically removed from the web view
// (due to user interaction or something),...
let someObject = ...;
let someOtherObject = ...;
// ... so we hold weak refs so that they are not kept
// alive just by virtue of being in c.changeListeners.
c.changeListeners.push(new WeakRef(someObject));
c.changeListeners.push(new WeakRef(someOtherObject));
是否存在传递“弱”回调函数的语法上不错的方法
(而不是预期实现containerStateChanged
的对象),
但是以某种方式使得回调本身不会使关闭对象保持活动状态?
换句话说,我想做这样的事情:
class Container {
// ...
stateChanged() {
for (let listener of this.changeListeners) {
listener.deref()?();
}
}
}
// ...
c.changeListeners.push(new WeakRef((c) => someObject.respondToNewState(c)));
c.changeListeners.push(new WeakRef((c) => someOtherObject.respondsSomeOtherWay(c)));
我试图避免从someObject
手动注销someOtherObject
和c.changeListeners
(或这些匿名回调),以便在将someObject
从中删除后进行GC DOM。
编辑:
我希望能够定期修剪c.changeListeners
的内容(通过检查.deref()
至undefined
的条目),所以这不是一个好的解决方案:
let weakSomeObject = new WeakRef(someObject);
let weakSomeOtherObject = new WeakRef(someOtherObject);
c.changeListeners.push((c) => weakSomeObject.deref()?.respondToNewState(c)));
c.changeListeners.push((c) => weakSomeOtherObject.deref()?.respondsSomeOtherWay(c)));
(或者,通常如何解决此问题?)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。