Angular 2调用函数,在for循环中使用subscribe

时间:2017-07-25 13:54:03

标签: angular

我有一个订阅内部服务的功能:

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循环不转到下一个项目?

2 个答案:

答案 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)
);