concat:如何使用特定的下一个函数处理每个订阅作为独立的

时间:2016-11-27 02:10:02

标签: javascript asynchronous rxjs reactive-programming rxjs5

我想在concat observable中独立处理每个订阅的响应。我在angular2中使用Rxjs 5.

let source1 = //some Http service
let source2 = //some Http service
let source3 = //some Http service  

Observable.concat(source1,source2,source3)
      .subscribe(data=> console.log(data));

上面的concat observable工作正常,只要从每个源返回的数据属于同一类型,并且我必须以相同的方式处理所有3个源的返回数据。

但是,如果从订阅生成承诺的来源和订阅中返回的每个来源数据不同并且需要唯一处理。这可能吗?以下是我要求的伪代码。

let source1 = //some Http service1 returns a string
let source2 = //some Http service2 returns a number
let source3 = //some Http service3 returns a boolean  

//The following is pseudo code
Observable.concat(source1,source2,source3)
      .subscribe(data_source1=> console.log(data_source1))
      .subscribe(data_source2=> console.log(data_source2 +3))
      .subscribe(data_source3=> console.log(data_source3 === true));

P.S。显然,所有响应都需要按顺序处理,而不是并行处理。

1 个答案:

答案 0 :(得分:1)

您可以使用在所有Observable完成后发出的forkJoin()

但是,你说你想按顺序处理响应,所以我猜你想要一个接一个地启动请求。

这仍然可以通过concat解决,然后将所有回复合并到toArray()的单个数组中。

const Observable = Rx.Observable;

let source1 = Observable.of(42).do(() => console.log('source1')).delay(500);
let source2 = Observable.of(true).do(() => console.log('source2')).delay(500);
let source3 = Observable.of("Hello, World!").do(() => console.log('source3')).delay(500);

Observable.concat(source1, source2, source3)
    .toArray()
    .subscribe(data => console.log(data));

打印到控制台:

"source1"
"source2"
"source3"
[42, true, "Hello, World!"]

有多个do()运算符表明Observables是以延迟启动的。

查看现场演示:https://jsbin.com/kikuceh/1/edit