【问题标题】:RxJS sequential operationsRxJS 顺序操作
【发布时间】:2018-01-16 13:57:43
【问题描述】:

我正在使用 RxJS 与数据库进行通信,并且我正在尝试发送复杂的复合对象。我们的 API 允许我们一次注入一个元素(即 POST 不会处理正文中的数组) 考虑以下对象,其中 mainFieldsubFields 将是 DB 中的单独表实体:

OBJ = {
      'mainField': 'Main content'
      'subFields': [ 'obj1','obj2','obj3' ]
    }

要求是:

  1. mainField 必须首先传输,响应对象将提供参考 ID,subFields 将使用该 ID
  2. subFields 的每个元素都必须作为单个元素传输,当响应到达时,可以请求另一个元素

对我来说,概念上的过程看起来像这样(send 函数是一种简化,它接受任何东西并返回这种类型的 observable):

send(OBJ.mainField) /* This will return Observable of mainField */
.flatMap(res => {
   OBJ.subFields.forEach(sub => {
     sub.id = res.id
   })
   Obervable.of(OBJ.subFields)
})
.flatMap(subField => {
  send(subField )
})

我相信有更好的方法来做到这一点(即分离数组,发出一系列可观察对象并等待它们按顺序完成,然后继续)。如有任何建议,我将不胜感激

【问题讨论】:

    标签: angular rxjs rxjs5


    【解决方案1】:

    您可以使用concat 确保仅在前一个完成后才按顺序订阅 Observable。

    Observable.of(OBJ) // or whatever...
      .concatMap(obj => {
        const mainField$ = send(obj.mainField);
        // the `concat()` subscribes to each Observable in order
        const subFields$ = Observable.concat(obj.subFields.map(field => send(obj.mainField)));
    
        // start processing `subFields$` after `mainField$` completed
        return mainField$.concat(subFields$);
      })
      .subscribe(() => console.log('All done'));
    

    如果您没有在用例中使用Observable.of(OBJ),您可以像以前一样使用send(obj.mainField)

    【讨论】:

      猜你喜欢
      • 2020-02-26
      • 2016-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多