Javascript 使用RxJS观测值时数据的I/O关系

Javascript 使用RxJS观测值时数据的I/O关系,javascript,rxjs,observable,Javascript,Rxjs,Observable,我想隐藏通过可观察操作符遍历的数据的一部分,以便保持完整性 例如,如果我有一个像{private,public}这样的数据对象,我想执行以下操作: 提取public属性并将其传递给自定义流custom$ 在custom$完成后,我想恢复关系,这样我就有了一个对象{private,data},其中数据是custom$流的结果 我不想使用concatMap,因为custom$可能会阻止传入数据并使流“变慢” 我目前正在使用以下工具,但它看起来非常麻烦,感觉我做错了什么: console.clear

我想隐藏通过可观察操作符遍历的数据的一部分,以便保持完整性

例如,如果我有一个像
{private,public}
这样的数据对象,我想执行以下操作:

  • 提取
    public
    属性并将其传递给自定义流
    custom$
  • custom$
    完成后,我想恢复关系,这样我就有了一个对象
    {private,data}
    ,其中数据是
    custom$
    流的结果 我不想使用
    concatMap
    ,因为
    custom$
    可能会阻止传入数据并使流“变慢”

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

    console.clear();
    const input$=新的Rx.Subject();
    const custom=data$=>data$.switchMap(
    ({value,delay})=>Rx.Observable.of(`data${value}`)。延迟(delay)
    );
    const out$=输入$.mergeMap(
    ({secret,data})=>
    Rx.Observable.zip(
    Rx.Observable.of(data).let(data$=>custom(data$),
    可观测的(秘密的)
    ));
    out$.subscribe(([data,secret])=>console.log(data,'=',secret));
    输入$.next({secret:1,data:{value:1,delay:4000});
    输入$.next({secret:2,data:{value:2,delay:1000});
    输入$.next({secret:3,data:{value:3,delay:3000})
    
    所有运算符的第二个参数是一个结果选择器,它获取流平坦化的结果,并允许您将其与原始参数重新连接

    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));
    

    我认为这应该满足您的要求:

    您的数据

    流:

    const public$ = init$.pluck('data');
    
    const final$ = public$.last().withLatestFrom(init$).map(x => x[0]);
    
    如何检查它是否符合您的要求:

    final$
      .do(console.log)
      .subscribe();
    
    输出:

    您可以在这里安全地使用
    public$
    ,因为这里没有机密数据,如果您想要初始流的最新(完整)值,可以使用
    final$


    这里有一个演示:

    谢谢!我现在感觉非常沮丧:-)一直盯着文档,没有注意到有一个选择器函数。
    final$
      .do(console.log)
      .subscribe();
    
    Object {value: 3, delay: 3000}