2016-11-27 3 views
1

Я бы хотел обработать ответ каждой подписки независимо друг от друга в конкатенаблюдении. Я использую Rxjs 5 в угловом2.concat: как обрабатывать каждую подписку с помощью определенной следующей функции как независимой

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 Наблюдаемые работает отлично, до тех пор, возвращаемые данные из каждого источника такого же типа, и я должен обрабатывать возвращаемые данные таким же образом для всех 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

Вы можете использовать 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() операторов, чтобы показать, что Наблюдаемые запускаются с задержкой.

Смотреть демо: https://jsbin.com/kikuceh/1/edit

+0

Он работал, что указал мне в правильном направлении, спасибо! – Luther