是否可以在对象而不是数组中将Observables分组?

时间:2018-08-23 12:37:07

标签: javascript rxjs reactive-programming

我有几个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"
  })

这是我的主要观点-避免此类“难以发现”的错误

2 个答案:

答案 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;
  }, {})));
}

在此处查看示例:https://stackblitz.com/edit/typescript-dvrff8

答案 1 :(得分:2)

没有内置的RxJS运算符可以执行此操作,但是您可以使用以下语法:

.subscribe(([two, three, four]) => {
  // ...
})

...或者这个:

.subscribe(results => {
  const [two, three, four] = results
}