Rxjs顺序处理观察值和嵌套观察值

Rxjs顺序处理观察值和嵌套观察值,rxjs,Rxjs,我正在与RXJS合作,并尝试处理顺序操作。有一个类似的问题,我本来会发表评论,但我是新来的:)虽然我几乎让它工作,但我缺乏的是在父操作后采取行动的能力。在过程世界中,我会将其概念化为嵌套循环,其中外部循环的每个迭代都有一些处理 使用下面的代码,它会在每个子项之后打印“已处理的父项”,我希望它在子项全部完成后运行。我相信这是因为concatMap是如何将所有东西都展平的,所以它会迷失方向,但我不认为有什么好方法可以记录单亲家长何时完成学业。我想出的一个不太好的方法是使用doOnCompleted(

我正在与RXJS合作,并尝试处理顺序操作。有一个类似的问题,我本来会发表评论,但我是新来的:)虽然我几乎让它工作,但我缺乏的是在父操作后采取行动的能力。在过程世界中,我会将其概念化为嵌套循环,其中外部循环的每个迭代都有一些处理

使用下面的代码,它会在每个子项之后打印“已处理的父项”,我希望它在子项全部完成后运行。我相信这是因为concatMap是如何将所有东西都展平的,所以它会迷失方向,但我不认为有什么好方法可以记录单亲家长何时完成学业。我想出的一个不太好的方法是使用doOnCompleted(),但是它似乎不允许您返回一个可观察对象来保持链接

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(父级))之前使用toArray()找到了解决方案。还尝试了bufferWithCount(parent.children.length),它也很有效,在我看来读起来更好一些。

您能用预期输出和当前输出更新您的问题吗?这可能只是因为您的日志错误,而不是您的函数错误。此外,您还可以在
processParent(parent)
的末尾添加
finally
,以便在可观察对象完成时执行某些操作,因此您可以使用它代替
.do(()=>console.log('processed parent',parent))我添加了当前和所需的输出。我使用日志来帮助我跟踪观察对象是如何工作的,因为我还不确定如何调试它们。我还尝试了finally(),它的工作方式类似于doOnCompleted,其中console.log可以工作,但返回另一个可观察对象的东西却不能。在我的实际项目中,我希望能够在这一点上执行一些数据库清理步骤。我找到了一个解决方案,可以解决这个问题,所以我必须看看它在实践中的效果如何。如果我在清理之前做一个toArray(),它会起作用。
最后
如果可观察对象由于错误而终止,它也会起作用,所以您可能想看看它如何适合您的用例