将三个不同的函数映射到Node.js

时间:2016-09-26 20:55:03

标签: node.js ecmascript-6 reactive-programming rxjs

我是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(); 

如何将此数据流拆分为三个,并将每个数据实例映射到不同的函数?

1 个答案:

答案 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()可能对您有用。