如何有条件地使用'flatmap'运算符?(Angular 2/rxjs)

Joe*_*aju 4 rxjs ecmascript-6 flatmap rxjs5 angular

我想要实现的是有条件地运行一系列可观察量.

return observable.map(response => response)
       .flatmap(response1 => observable1(response1))
       .flatmap(response2 => observable2(response2))
       .flatmap(response3 => observable3(response3))
Run Code Online (Sandbox Code Playgroud)

我需要检查response1并在需要时调用剩余的observable,否则我需要返回response1并中断执行,依此类推.

我已经完成了以下SO问题,但他们似乎没有回答我的问题

有条件地选择RxJS中的observable

RXJS如果具有可观察的条件

处理RxJs flatMap流中的错误并继续处理

我是rxjs的新手,如果这个问题看起来太蹩脚,请原谅我.

任何帮助将不胜感激.

谢谢

mar*_*tin 5

这就像调用多个连续的HTTP请求,其中结果相互依赖.这是你想要使用的地方,concatMap()因为它会等到从回调函数返回的Observable完成.

很难从描述中确切地知道你想要做什么,但如果你需要停止传播结果(并避免调用不必要的HTTP请求),请看一下takeWhile()运算符或简单的filter()运算符.

filter():

return observable
    .concatMap(response => response)
    .filter(response1 => response1.whatever === true)
    .concatMap(response1 => observable1(response1))
    .filter(response2 => response2.whatever === true)
    .concatMap(response2 => observable2(response2))
    .filter(response3 => response3.whatever === true)
Run Code Online (Sandbox Code Playgroud)

如果filter测试失败,这将不会进一步传播该项目.但是,源observable仍然可以发出将通过链的值.换句话说,filter操作员没有完成链条.

takeWhile():

return observable
    .concatMap(response => response)
    .takeWhile(response1 => response1.whatever === true)
    .concatMap(response1 => observable1(response1))
    .takeWhile(response2 => response2.whatever === true)
    .concatMap(response2 => observable2(response2))
    .takeWhile(response3 => response3.whatever === true)
Run Code Online (Sandbox Code Playgroud)

如果任何takeWhile()结果为false,它将完成链并且不能发出其他值.