我正在使用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),它也有效,在我看来更好一点。