2016-02-28 7 views
1

Я новичок в rxjs, и мне нужно вызвать 3 асинхронных запроса, которые начинались как обещания, и помещать возвращенные объекты в массив в том порядке, в котором они были вызваны. Вот то, что я (частично основана на this question):rxjs: Цепочные запросы Async

let observeFront = Observable.fromPromise(this.requestAsync(frontSlice, "front")); 
let observeMiddle = Observable.fromPromise(this.requestAsync(midSlice, "middle")); 
let observeEnd = Observable.fromPromise(this.requestAsync(endSlice, "end")); 

let observeCombined = Observable.concat(observeFront, observeMiddle, observeEnd); 

observeCombined.subscribe(data => { 
    // this logs only one object - need all 3 in proper order 
    console.log(data); 
    this.resultsEmitter.emit(data) 
}); 

observeFront.subscribe(response => { 
    // logs the correct object 
    console.log("front result:", response); 
}); 

observeMiddle.subscribe(response => { 
    // correct 
    console.log("middle result:", response); 
}); 

observeEnd.subscribe(response => { 
    // correct 
    console.log("end result:", response); 
}); 

Как я могу испускать результат только тогда, когда у меня есть [frontOb, middleObj, endObj]?

+0

См http://stackoverflow.com/questions/35247310/angular-2-promise-all-with-rxjs/35247372#35247372 –

ответ

1

Как @Eric предложил вы можете использовать forkJoin() вместо concat():

let observeFront = Observable.fromPromise(this.requestAsync(frontSlice, "front")); 
let observeMiddle = Observable.fromPromise(this.requestAsync(midSlice, "middle")); 
let observeEnd = Observable.fromPromise(this.requestAsync(endSlice, "end")); 

let observeJoined = Observable.forkJoin(observeFront, observeMiddle, observeEnd); 

observeJoined.subscribe(data => { 
    console.log(data); // => [frontOb, middleObj, endObj] 
    this.resultsEmitter.emit(data) 
}); 
Смежные вопросы