2017-07-25 28 views
3

我有訂閱的功能,內部服務:角2調用函數內部認購循環

selectCar(carNumber) { 
    this.carService.getCarByNumerator(carNumber) 
    .subscribe((car) => { 
        console.log(carNumber); 
        //more stuff here 
       }, 
       (err) => console.log(err) 
       ); 
} 

我想調用這個函數內部的循環如下:

for(let carNumber of carNumbers) { 
    this.selectCar(carNumber); 
} 

問題是,有時候它可以像我期望的那樣工作,但有時訂單不在列表中。

E.g.該列表是:

45 
67 
89 

但是當我看在控制檯中,我看到以下內容:

67 
89 
45 

我怎麼能強迫的循環不要去下一個項目,直至當前函數調用完成?

+0

您可以將您的功能更改爲遞歸功能,這將有助於增加成本。 –

+0

正在對API /後端進行異步調用,但不能保證數據將按特定順序返回。你能簡單地對結果進行排序/排序嗎?否則,您可以考慮諸如[combineAll](https://github.com/ReactiveX/rxjs/blob/master/src/operator/combineAll.ts)或[Subject](https://github.com/Reactive-擴展/ RxJS/blob/master/doc/gettingstarted/subjects.md) –

回答

2

我猜flatMap會幫助你在這種情況下。

Observable.of(carNumbers) 
.flatMap(term => this.selectCar(term)) 
.subscribe((car) => { 
     console.log(carNumber); 
     //more stuff here 
    }, 
    (err) => console.log(err) 
); 
+0

感謝您的回答。我有兩個關於它的問題:1.似乎selectCar的內容會發生兩次,不是嗎?因爲你們都稱之爲,之後再做它的東西。 2.如果我嘗試這樣做,我會在我嘗試將術語發送到selectCar的部分出現錯誤。它說,它接受一個單一的汽車號碼,但得到一個完整的陣列。它是什麼類型的?數組或全部數組中的一項? – Batsheva

2

如果您需要有效地等待所有getCarByNumerator()之前處理的數據列表來完成,你可以使用forkJoin操作。

let carNumbers = [1, 2, 3]; 
let observables = carNumbers.map(carNumber => this.carService.getCarByNumerator(carNumber)); 

// forkJoin the array/collection of observables 
let source = Rx.Observable.forkJoin(observables); 

// subscribe and sort combined array/collection prior to additional processing 
source.subscribe(x => console.log(x.sort((a, b) => a - b)); 

這裏是JS Bin演示的功能。該示例演示了從「API」返回數據的各種延遲。

希望有幫助!

+0

這幫了我很多!謝謝,你救了我的一天 –