angular - RxJS 顺序操作

标签 angular rxjs rxjs5

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

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

要求是:

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

我的概念过程看起来像这样(send 函数是一种接受任何东西并返回这种类型的可观察对象的简化):

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

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

最佳答案

您可以使用 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)

关于angular - RxJS 顺序操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48282928/

相关文章:

angular - 找不到模块 : Error: Can't resolve 'rxjs/add/observable/throw'

Angular 单元测试 : how to use marble testing (rxjs/testing) to test this state management service

node.js - 使用 RxJS5 设置速率

javascript - 使用 ng-bootstrap 从 Api 获取数据的 Angular 6 分页

html - 当输入的日期小于当前日期时,Angular 7 :Apply style sheet to input field on change of value i. e

angular - Travis build 正在等待用户输入(安装 Angular )

javascript - 如何链接/组合 Observables

Angular:位置回溯历史

typescript - 为什么 takeWhile 运算符在包含时不过滤?

javascript - 监听函数执行