我有几个Observables
,我想为他们做类似Promise.all
的事情(也许.forkJoin
)
const two = Observable.of(2);
const three = Observable.of(3);
const four = Observable.of(4);
但是结果是我想要一个对象而不是数组,因为我不想通过数字键访问数据。
.subscribe(result => {
const two = result[0] // I don't want this
const three = result[1]
const four = result[2]
})
我想看的是做类似的事情
.subscribe(result => {
const two = result.two // this is much better
const three = result.three
const four = result.four
})
确定我可以做这样的事情:
Observable
.forkJoin(two, three, four)
.flatMap(result => Observable.of({two: result [0], three: result [1], four: result [2]}))
但最终还是一样-我将根据数字键获取数据。
有什么想法吗?
谢谢
PS 。一种可能的suggested解决方案-使用解构:
const [two, three, four] = [...result]
感觉好多了,但是如果.forkJoin
有人会更改顺序,则不会提供任何帮助:
//was
.forkJoin(two, three, four)
//become
.forkJoin(two, four, three)
// ...
.subscribe(([two, three, four]) => {
// say hello to "magic errors"
})
这是我的主要观点-避免此类“难以发现”的错误
答案 0 :(得分:3)
我写了一个实用程序功能,使您可以在RxJS 6
中执行此操作。我不确定您使用的是哪个版本,但希望在那里可以支持它。
function forkJoinObj(obj) {
const keys = Object.keys(obj);
const values = Object.values(obj);
return forkJoin(values).pipe(map(result => result.reduce((acc, next, index) => {
acc[keys[index]] = next;
return acc;
}, {})));
}
答案 1 :(得分:2)
没有内置的RxJS运算符可以执行此操作,但是您可以使用以下语法:
.subscribe(([two, three, four]) => {
// ...
})
...或者这个:
.subscribe(results => {
const [two, three, four] = results
}