使用RxJS observables

时间:2017-05-30 13:17:51

标签: javascript rxjs observable

我希望隐藏遍历可观察运算符的数据的一部分,以便维护整数。

例如,如果我有一个像{ private, public }这样的数据对象,我想这样做:

  1. 选择public属性并将其传递给自定义流custom$
  2. custom$完成后我想要恢复关系,以便我有一个对象{ private, data },其中数据是custom$流的结果。
  3. 我不想使用concatMap,因为custom$可能阻止传入的数据并使流"缓慢"。

    我目前正在使用以下内容,但它看起来非常麻烦,感觉我做错了什么:

    
    
    console.clear();
    
    const input$ = new Rx.Subject();
    const custom = data$ => data$.switchMap(
      ({ value, delay }) => Rx.Observable.of(`data ${value}`).delay(delay)
    );
    
    const out$ = input$.mergeMap(
      ({ secret, data }) =>
        Rx.Observable.zip(
          Rx.Observable.of(data).let(data$ => custom(data$)),
          Rx.Observable.of(secret)
        ));
    
    
    out$.subscribe(([data, secret]) => console.log(data, '=', secret));
    
    input$.next({ secret: 1, data: { value: 1, delay: 4000 }});
    input$.next({ secret: 2, data: { value: 2, delay: 1000 }});
    input$.next({ secret: 3, data: { value: 3, delay: 3000 }});
    
    <script src="https://unpkg.com/rxjs/bundles/Rx.min.js"></script>
    &#13;
    &#13;
    &#13;

    有更简单/更明智的方法吗?

2 个答案:

答案 0 :(得分:2)

所有*Map运算符的第二个参数是一个结果选择器,它获取展平流的结果,并允许您使用原始参数重新加入它。

const input$ = new Rx.Subject();
const custom = data$ => data$.switchMap(
  ({ value, delay }) => Rx.Observable.of(`data ${value}`).delay(delay)
);

const out$ = input$.mergeMap(
  ({ secret, data }) => Rx.Observable.of(data).let(custom), 
  ({secret}, newData) => ({secret, data: newData})
);


out$.subscribe(({data, secret}) => console.log(data, '=', secret));

答案 1 :(得分:0)

我认为这应该做你想要的:

您的数据

brew unlink mariadb

brew install mariadb-connector-c
ln -s /usr/local/opt/mariadb-connector-c/bin/mariadb_config /usr/local/bin/mysql_config

pip install mysqlclient

rm /usr/local/bin/mysql_config
brew unlink mariadb-connector-c
brew link mariadb

Streams:

const { Observable } = Rx;

const init$ = Observable.from([
  { secret: 1, data: { value: 1, delay: 4000 }},
  { secret: 2, data: { value: 2, delay: 1000 }},
  { secret: 3, data: { value: 3, delay: 3000 }}
]);

如何检查它是否符合您的要求:

const public$ = init$.pluck('data');

const final$ = public$.last().withLatestFrom(init$).map(x => x[0]);

<强> 输出:

final$
  .do(console.log)
  .subscribe();

您可以在此安全使用Object {value: 3, delay: 3000} ,因为这不是秘密数据,如果您想要初始流的最新(完整)值,可以使用public$。< / p>

这是一个演示:https://codepen.io/anon/pen/VbJEvW?editors=0010