淘汰赛可观察到多个订阅

雷吉

我已经继承了使用UI的Knockout编写的应用程序,并且很好奇对单个可观察属性进行多个订阅有什么影响?

我有2个订阅的观察站。通过登录到控制台,我可以看到两个订阅都被触发,一个接一个。

使用下面的示例:(为简洁起见,在完整的代码中为简洁起见,这里有很多逻辑,其中有些是重复的)

self.VisitDate = ko.observable();

self.VisitDate.subscribe(function (newValue) {
    self.ListItemRemoved(removed);
});   

self.VisitDate.subscribe(function (newValue) {
    self.Basket.VisitDate(newValue);
});

我当时在想,由于有多个订阅,因此我应该看到某种错误,但是一切似乎都正常,但是我找不到任何明确的解释来说明为什么可以这样做?

我只是想找出以下内容:

对一个可观察的对象有多个订阅是否正常并且可以接受?这样做对比赛有潜在的影响吗?是否真的需要多个订阅才能实现无法通过单个订阅实现的功能?

我很欣赏这可能有点细节,但是我实际上只是想了解敲除的幕后工作方式,以了解我是否应该重构该代码。

VLAZ

观察者/可观察到的设计模式,并允许多个观察者/订阅。简而言之,设计模式的目的是:

  1. 使更改与更改的影响脱钩。
  2. 允许任何和任意影响源于更改。

因此,淘汰赛是通过可观察的方式做到的。

var observable = ko.observable("a");

observable.subscribe(function(newValue) {
  console.log("observer 1", newValue)
});

observable.subscribe(function(newValue) {
  console.log("observer 2", newValue)
});

observable.subscribe(function(newValue) {
  console.log("observer 3", newValue)
});

observable("b");
observable("c");
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>

因为您的代码将在单个线程中运行,所以没有真正需要担心的竞争条件,因此,除非您明确选择加入某种多线程性,否则几乎可以肯定它是确定性的

通常,观察者通常也不会固有地调用多个线程,因为子订阅者更新功能通常采用以下形式:

for (subscriber of this.subscribers) {
  subscriber.update(this.value);
}

这样说来,您可能会遇到问题,但前提是订户依赖于共享状态,并且您不能保证或知道每个订户的添加顺序。在这种情况下,您可以根据订阅顺序获得不同的结果。简单演示:

var observable = ko.observable("a");

var sharedState = "";

observable.subscribe(function(newValue) {
  //append to the shared state
  sharedState += newValue;
  console.log("observer 1", sharedState);
});

observable.subscribe(function(newValue) {
  //double up the shared state
  sharedState += sharedState;
  console.log("observer 2", sharedState);
});

observable("b");
observable("c");
observable("d");
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>

var observable = ko.observable("a");

var sharedState = "";


observable.subscribe(function(newValue) {
  //double up the shared state
  sharedState += sharedState;
  console.log("observer 2", sharedState);
});

observable.subscribe(function(newValue) {
  //append to the shared state
  sharedState += newValue;
  console.log("observer 1", sharedState);
});

observable("b");
observable("c");
observable("d");
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>

因此,这将是一个坏习惯。如果可能的话,最好避免。除非您可以保证订阅的顺序-在上面的示例中,我将一个接一个地添加订阅,以确保它们以添加的顺序显示。但是,您可能拥有可以有条件地或在应用程序的不同部分添加订阅的代码,在这种情况下,很难控制该顺序。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

淘汰赛绑定包装器,输入更改不会触发可观察到的订阅

可观察到淘汰赛更新

淘汰赛可观察到的最新价值

浏览器之间可观察到的淘汰赛共享-仅在本地更改值时订阅

从可观察到的淘汰赛中删除最后一个角色

如何在html上显示此可观察到的淘汰赛?

计算出的强制淘汰赛在更换可观察到的内部后重新评估

淘汰赛-添加了可观察到的未在新对象上更新的功能

用JavaScript编写类似C#的扩展以实现可观察到的淘汰赛

选择的下拉值更改时,可观察到的淘汰赛未更新

将recaptcha响应放入可观察到的js淘汰赛中

可观察到淘汰赛-为什么此值会自动更新?

为什么可观察到的不通知是否阻止了淘汰赛?

淘汰赛可观察的订阅多次触发

淘汰赛订阅可观察的复杂对象的任何更改

无法在淘汰赛js中观察到数据

淘汰赛无法观察到样式属性

当儿童可观察到的更新时,淘汰赛js css似乎没有重新计算

淘汰赛:更改可观察值

是否让淘汰赛计算对象订阅不在初始执行路径中的可观察对象?

淘汰赛订阅/事件类型系统没有可观察的?

淘汰赛可观察订阅:超过最大调用堆栈

淘汰赛如何设置可观察儿童的价值

在淘汰赛中对可观察的列表进行排序

淘汰赛JS和可观察的单选按钮

分配时淘汰赛可观察数组被覆盖

替换作为参数发送的可观察的淘汰赛

淘汰赛:找出计算出的可观察触发

带有字符的淘汰赛追加可观察对象