首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rx合并+ CombineLatest?

Rx合并+ CombineLatest?
EN

Stack Overflow用户
提问于 2016-07-08 14:09:20
回答 1查看 3.1K关注 0票数 1

当两个可观测数据都启动时,CombineLatest就会启动。

代码语言:javascript
复制
A     1----------2---------------
B     -----a----------b---c------
C     -----1a----2a---2b--2c-----   C = A.CombineLatest(B)

Merge运算符在A或B已启动时启动。然而,它不能结合A和B的最新值。

代码语言:javascript
复制
A     1----------2---------------
B     -----a----------b---c------
C     1----a-----2----b---c------   C = A.Merge(B)

我需要一个像Merge那样的操作符,但是当两个可观察到的值开始时,它将允许我组合A和B的最新值:

代码语言:javascript
复制
A    1----------2---------------
B    -----a----------b---c------
C    1----1a----2a---2b--2c-----   C = A.MergeOrCombineLatest(B)

它的签名可能如下所示:

代码语言:javascript
复制
Observable<C> MergeOrCombineLatest<A, B, C>(
     this IObservable<A> a,
     IObservable<B> b,
     Func<A, C> aResultSelector, // When A starts before B
     Func<B, C> bResultSelector, // When B starts before A
     Func<A, B, C> bothResultSelector) // When both A and B have started

如何才能实施这一操作?

EN

回答 1

Stack Overflow用户

发布于 2016-07-08 20:04:07

首先,您为A,B选择您的可观测值永远不会发出的特殊值,让它为空:

代码语言:javascript
复制
A specialA = null;
B specialB = null;

然后

代码语言:javascript
复制
Observable<C> MergeOrCombineLatest<A, B, C>(
  this IObservable<A> a,
  IObservable<B> b,
  Func<A, C> aResultSelector, // When A starts before B
  Func<B, C> bResultSelector, // When B starts before A
  Func<A, B, C> bothResultSelector) // When both A and B have started
{
  return a.StartWith(specialA).CombineLatest(b.StartWith(specialB), 
    (aval, bval) => {
      if (aval == specialA) return bval == specialB ? default(C) : bResultSelector(bval);
      if (bval == specialB) return aResultSelector(bval);
      return bothResultSelector(aval, bval);
    }
  ).skip(1);  // skip the first emission where both are special values
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38268748

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档