Angular 2中如何在for循环内部使用subscribe调用函数

6

我有一个包含订阅服务的函数:

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

我想在for循环内调用以下函数:
```html

functionName();

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

问题在于,有时它按照我的预期工作,但有时顺序不如列表中所示。

例如,列表如下:

45
67
89

但是当我查看控制台时,我看到以下信息:

67
89
45

如何强制 for 循环不进行下一项,直到当前函数调用结束?

你可以将你的函数改为递归函数,这样会有所帮助,但代价是增加了。 - soroush gholamzadeh
正在向API/后端发出异步调用,无法保证数据按特定顺序返回。您是否可以在进行其他处理/显示之前简单地对结果进行排序/排序?否则,您可以考虑使用combineAllSubject等运算符。 - Alexander Staroselsky
2个回答

8
如果您需要在处理数据列表之前有效地等待所有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”返回数据的不同延迟。
希望能对您有所帮助!

这对我帮助很大!谢谢你,你救了我的一天。 - Beytullah Güneyli

2

我猜在这种情况下,flatMap会对你有帮助。

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

感谢你的回答。我有两个问题:1. 似乎selectCar的内容会出现两次,是吗?因为你既调用了它还后来再做一遍它的操作。2. 如果我尝试这样做,我会在尝试将term发送到selectCar部分时收到错误信息。它说它只接受单个车牌号码,但是却得到一个整个数组。那term类型是什么?数组中的一个项目还是整个数组? - Batsheva

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接