2

如果我有这样的数组数组

{
    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);

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

4

2 回答 2

5

concatMap在这里效果更好。因为如果迭代孩子是异步的,孩子的顺序就会混乱。concatMap可以确保一次完成一个父母。

Rx.Observable.from(parents)
  .concatMap(function (p) {
    return Rx.Observable.from(p.children)
  })
  .subscribe();
于 2015-10-23T03:42:54.827 回答
3

看起来这是不久前提出的问题,但这是处理这种情况的一种方法:

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.
});

这个想法是利用flatMapwhich 将返回任何 Arrays、promise 或 observables 并将它们“扁平化”为单个事物的 observable。

我认为您也可能受益于平面映射您对子节点所做的异步事情的结果,所以我在其中添加了它。然后你可以订阅结果。

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

于 2015-01-08T17:20:54.480 回答