RxJS排队依赖任务

时间:2014-12-01 17:56:34

标签: rxjs

如果我有这样的数组数组

{
    parent: [
        {
            name: 'stu',
            children: [
                {name: 'bob'},
                {name: 'sarah'}    
            ]
        },
        { 
          ...
        }
    ]
}

我希望循环遍历每个父级并循环遍历他们的子系列,这样我就不会启动下一个父级,直到所有子级都被处理(一些长的异步过程),我该怎么做RxJS ?

我试过这个:

var doChildren = function (parent) {
    console.log('process parent', parent.name);
    rx.Observable.fromArray(parent.children)
    .subscribe(function (child) {
        console.log('process child', child.name);
        // do some Asynchronous stuff in here
    });
};

rx.Observable.fromArray(parents)
.subscribe(doChildren);

但我让所有的父母都退出了,然后是所有的孩子。

2 个答案:

答案 0 :(得分:5)

concatMap在这里效果更好。因为如果迭代子节点是异步的,则子节点的顺序将被搞砸。 concatMap可以确保一次完成一位家长。

Rx.Observable.from(parents)
  .concatMap(function (p) {
    return Rx.Observable.from(p.children)
  })
  .subscribe();

答案 1 :(得分:4)

看起来这是前一段时间的问题,但这是处理这种情况的一种方法:

Rx.Observable.fromArray(parents)
.flatMap(function(parent) {
  return parent.children;
})
.flatMap(function(child) {
  return doSomeAsyncThing(child); //returns a promise or observable
})
.subscribe(function(result) {
  // results of your async child things here.
});

我们的想法是利用flatMap,它将会返回任何数组,承诺或可观察数据,以及#34;展平"将它们变成可观察到的个别事物。

我认为您可能也会受益于平面映射您对子节点执行的异步操作的结果,因此我已将其添加到那里。然后你可以订阅结果。

我仍然觉得这个问题缺乏一些背景,但希望这是你正在寻找的。