【问题标题】:Create Observable that behaves like CombineLatest but only emit the value of the source that just fired创建行为类似于 CombineLatest 但只发出刚刚触发的源的值的 Observable
【发布时间】:2018-06-06 11:21:55
【问题描述】:

我想创建一个 observable,它接受 N 个 observable 源并使用 N 元函数对其​​进行转换。这个 observable 的 onNext() 将在源 observable 之一发出一个项目时调用这个函数,如下所示: f(null,null,null,o3.val,null,null) 其中 o3 是刚刚发出一个值的源.

就像 combineLatest 调用 f 时将来自所有源的最后发出的值组合在一起,但在 f 中,我们得到所有其他源的 null 值。

f 的主体可以像一个开关:

 function f(v1,v2,...vn) {
        if (v1) { ... }
        else if(v2) { ... }
    }

这可能吗?还有其他方法可以完成这种行为吗?

【问题讨论】:

  • 所以你希望它发出一个 nulls 数组,但只在刚刚发出的源 Observable 的索引处你想要它的值?
  • 是的,这可能是一种方式
  • 您将n observables 组合成一个值数组,然后使用一系列if 语句根据发出的值选择代码路径,这似乎很奇怪。为什么不让n observables 和n 订阅您需要的代码?
  • 您需要根据某个时间片选择值。否则,如果它们始终同时产生值,您将不必要地强制顺序处理。
  • 这基本上不就是merge吗?

标签: javascript rxjs system.reactive reactivex


【解决方案1】:

你可能想考虑这样的事情

const obsS1 = obsSource1.pipe(map(data => [data, 'o1']));
const obsS2 = obsSource2.pipe(map(data => [data, 'o2']));
....
const obsSN = obsSourceN.pipe(map(data => [data, 'oN']));

merge(obs1, obs2, ..., obsN)
.subscribe(
  dataObs => {
    // do what you need to do
    // dataObs[0] contains the value emitted by the source Observable
    // dataObs[1] contains the identifier of the source Observable which emitted last
  }
)

【讨论】:

  • 可能是,但我不明白代码是如何工作的,可能是管道操作员对它的任何引用?与以下内容相同:blog.hackages.io/rxjs-5-5-piping-all-the-things-9d469d1b3f44
  • @Fruff 我在这里没有使用pipe 运算符。我正在使用 RxJs (import {merge} from 'rxjs';) 提供的merge 函数。我提供的 sn-p 的工作方式如下:在dataObs 变量中,您有一个包含 2 个元素的数组 - 第一个是发出的值,第二个是标识发出该值的源 Observable 的 ID,即您在上一条评论中提到的“标签”。
猜你喜欢
  • 2017-04-08
  • 2015-04-21
  • 1970-01-01
  • 1970-01-01
  • 2016-05-10
  • 1970-01-01
  • 1970-01-01
  • 2010-09-29
  • 1970-01-01
相关资源
最近更新 更多