我使用RxJS与数据库进行通信,而我正在尝试发送复杂的复合对象。我们的API让我们一次注入一个元素(即POST不会处理正文中的数组)
考虑以下对象,mainField
& subFields
将是DB中的单独表实体:
OBJ = {
'mainField': 'Main content'
'subFields': [ 'obj1','obj2','obj3' ]
}
要求是:
mainField
,响应对象将提供参考ID,subFields
将使用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 )
})
我相信有一种更好的方法可以做到这一点(即分开阵列,发出一系列可观察物并等待它们按顺序完成,然后继续前进)。我对任何建议表示感谢
答案 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)
。