我是Rxjs的新手。如果可能的话,我想遵循最佳实践。
我正在尝试对observable中返回的相同数据执行三个不同的函数。遵循'数据流'概念,我一直在想我需要将这个Observable分成三个流并继续。
这是我的代码,所以我可以停止抽象地说:
// NotEmptyResponse splits the stream in 2 to account based on whether I get an empty observable back.
let base_subscription = RxNode.fromStream(siteStream).partition(NotEmptyResponse);
// Success Stream to perform further actions upon.
let successStream = base_subscription[0];
// The Empty stream for error reporting
let failureStream = base_subscription[1];
//Code works up until this point. I don't know how to split to 3 different streams.
successStream.filter(isSite)
.map(grabData)// Async action that returns data
/*** Perform 3 separate actions upon data that .map(grabData) returned **/
.subscribe();
如何将此数据流拆分为三个,并将每个数据实例映射到不同的函数?
答案 0 :(得分:1)
实际上partition()
运算符内部只有calls filter()
operator twice。首先根据与predicate
匹配的值创建Observable,然后创建与predicate
不匹配的值。
所以你可以用filter() operator完成同样的事情:
let obs1 = base_subscription.filter(val => predicate1);
let obs2 = base_subscription.filter(val => predicate2);
let obs3 = base_subscription.filter(val => predicate3);
现在你有三个Observable,每个都只发出一些特定的值。然后,您可以继续使用现有代码:
obs2.filter(isSite)
.map(grabData)
.subscribe();
请注意,调用subscribe()
会触发源Observable的生成值。根据您使用的Observable,这并不总是这样。请参阅文档中的“Hot” and “Cold” Observables。根据您的使用情况,Operator connect()
可能对您有用。