【发布时间】:2019-10-15 05:21:46
【问题描述】:
我继承了一个使用 Knockout 为 UI 编写的应用程序,我很好奇对单个可观察属性进行多个订阅的效果是什么?
我有一个有 2 个订阅的 observable。通过登录控制台,我可以看到两个订阅一个接一个地被触发。
使用以下示例:(为简洁起见,在完整代码中有很多逻辑,其中一些是重复的)
self.VisitDate = ko.observable();
self.VisitDate.subscribe(function (newValue) {
self.ListItemRemoved(removed);
});
self.VisitDate.subscribe(function (newValue) {
self.Basket.VisitDate(newValue);
});
我在想我应该看到某种错误,因为有多个订阅,但一切似乎都工作正常,但我找不到任何明确的解释为什么可以这样做?
我只是想找出以下内容:
对单个 observable 进行多个订阅是否正常且可以接受? 这样做是否有任何潜在的影响,即可能存在竞争条件? 是否真的需要多次订阅才能实现单次订阅无法实现的目标?
我很欣赏这可能有点害羞,但我真的只是想了解淘汰赛是如何在幕后做事的,看看我是否应该重构这段代码。
【问题讨论】:
-
observer/observable pattern设计允许多个订阅。整个想法是首先将更改及其效果解耦,然后使您能够拥有任何数量的效果。 KO在这方面并不奇怪。 “竞争条件”几乎不是问题 - JS 将在单个线程中运行您的代码,并且 observable 将一一通知每个观察者。
-
我明白了,因为它们在 1 个线程中,它们将一个接一个地执行,因此第二个订阅可以对第一个订阅的执行导致的更改采取行动,我是否理解正确?
标签: javascript knockout.js observable subscribe