我有一个订阅内部服务的功能:
selectCar(carNumber) {
this.carService.getCarByNumerator(carNumber)
.subscribe( (car) => {
console.log(carNumber);
//more stuff here
},
(err) => console.log(err)
);
}
我想在for循环中调用此函数,如下所示:
for(let carNumber of carNumbers) {
this.selectCar(carNumber);
}
问题是,有时它按预期工作,但有时订单不在列表中。
E.g。清单是:
45
67
89
但是当我查看控制台时,我看到以下内容:
67
89
45
在当前函数调用完成之前,如何强制for循环不转到下一个项目?
答案 0 :(得分:3)
如果您需要在处理数据列表之前有效等待所有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"返回数据的不同延迟。
希望这有帮助!
答案 1 :(得分:2)
我猜flatMap
会在这种情况下帮助你。
Observable.of(carNumbers)
.flatMap(term => this.selectCar(term))
.subscribe( (car) => {
console.log(carNumber);
//more stuff here
},
(err) => console.log(err)
);