Rxjs顺序处理observable和嵌套的observable

时间:2016-04-12 05:05:40

标签: rxjs

我正在使用RXJS并尝试处理顺序操作。有一个类似的问题RxJS queueing dependent tasks我会发表评论,但我是新的:)虽然我几乎有工作,但我缺乏的是能够在父操作后采取行动。在程序世界中,我将其概念化为嵌套循环,其中对外循环的每次迭代都有一些处理。

使用下面的代码,它会打印"已处理的父级"在每个孩子之后我想让它在孩子们完成之后运行。我相信这是因为concatMap如何使一切变得平坦,所以它失去了轨道,但我没有看到一个很好的方法来跟踪单亲完成的时间。我提出的一个不太好的方法是使用doOnCompleted(),但是这似乎不会让你返回一个observable来保持链接。

import {Observer, Observable} from 'rx';

let parents = [
  { children: ['a', 'b'] },
  { children: ['c', 'd'] }
];

let asyncCleanup = (data) => {
  return Observable.of(data)
    .do(() => console.log('cleaned up', data));
};

let processParent = (parent) => {
  let children = Observable.from(parent.children);
  return children
    .concatMap((child) => processChild(child))
    .concatMap(() => asyncCleanup(parent));
};

let processChild = (child) => {
  return Observable.from(child)
    .do(() => console.log('processed', child));
};

Observable.from(parents)
  .concatMap((parent) => processParent(parent))
  .subscribe(
    (data) => null,
    (err) => console.error(err),
    () => console.log('completed')
  );

Current output:
processed a
cleaned up { children: [ 'a', 'b' ] }
processed b
cleaned up { children: [ 'a', 'b' ] }
processed c
cleaned up { children: [ 'c', 'd' ] }
processed d
cleaned up { children: [ 'c', 'd' ] }
completed

Desired output:
processed a
processed b
cleaned up { children: [ 'a', 'b' ] }
processed c
processed d
cleaned up { children: [ 'c', 'd' ] }
completed

更新: 通过在.concatMap(()=> asyncCleanup(parent)之前使用toArray()找到解决方案。还尝试了bufferWithCount(parent.children.length),它也有效,在我看来更好一点。

0 个答案:

没有答案