RxJS顺序操作

时间:2018-01-16 13:57:44

标签: angular rxjs rxjs5

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

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

要求是:

    必须首先传输
  1. mainField,响应对象将提供参考ID,subFields将使用
  2. subFields的每个元素必须作为单个传输,当响应到达时,可以请求另一个
  3. 从概念上讲,我的程序看起来像这样(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 )
    })
    

    我相信有一种更好的方法可以做到这一点(即分开阵列,发出一系列可观察物并等待它们按顺序完成,然后继续前进)。我对任何建议表示感谢

1 个答案:

答案 0 :(得分:2)

您可以使用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)一样使用comm -23 <(command1) <(command2)