网站搜索

javascript - 在订阅时识别可观察事件的来源


我有一个 BehaviorSubject<Array<user>>(userListSub$)状态,它会从多个地方更新。

例如,

  • 当我点击关注一个用户时
  • 当我点击取消关注某个用户时
  • 当我收藏一个用户时

相同的状态正在被不同的组件订阅。我希望某个特定的组件在状态(userListSub$)触发事件时,如果该事件是我将用户标记为收藏时触发的,不做反应。

我知道我们也可以像这样在状态中存储事件的来源,
userListSub$.next({ data: user, origin: userList })
并在我订阅的地方检查来源。

有没有更好的方法来识别或忽略特定订阅上的事件?
我考虑的方向正确吗?如果不正确,你能建议一个更好的方法吗?

答案#1

你可以尝试一个稍微不同的模型。

假设你有3个组件:C1、C2 和 C3。所有组件都会对“点击关注用户”和“点击取消关注用户”事件作出反应。

只有 C1 和 C2 会对“收藏用户”事件作出反应。

在这种情况下,你可以建模两个事件流,因此需要两个 BehaviourSubject,我们称它们为 S1 和 S2,一个用于通知“点击关注用户”和“点击取消关注用户”事件,另一个用于通知“收藏用户”事件。

然后你可以创建一个 Observable,我们称之为 Obs1=merge(S1, S2),它将 S1 和 S2 合并。

现在,C1 和 C2 可以订阅 Obs1,而 C3 可以订阅 S1。

通过这种方式,你应该能够实现你的目标,并且至少在我看来,这比添加源的 id 更符合习惯用法的响应式方式来实现它。