我正在使用 RxJS 与数据库通信,我正在尝试发送复杂的复合对象。我们的 API 让我们一次注入(inject)一个元素(即 POST 不会处理正文中的数组)
考虑以下对象,其中 mainField
和 subFields
将是数据库中的单独表实体:
OBJ = {
'mainField': 'Main content'
'subFields': [ 'obj1','obj2','obj3' ]
}
要求是:
mainField
必须首先传输,响应对象将提供引用 ID,subFields
将使用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/