在 Angular 9 中,为什么我的订阅是顺序加载而不是并行加载?
In Angular 9, why are my subscriptions getting loaded sequentially instead of in parallel?
我正在使用Angular 9. 我想加载一系列对象,每个对象都有图像数据。我想先加载所有对象,然后再加载图像数据。我的 component.ts 文件中有这个 ngOnInit ...
ngOnInit(): void {
this.authService.getAllinLibrary().subscribe((res: any[]) => {
this.results = res;
...
for (let i = 0; i < results.length; i++) {
this.getTheImage(res[i].Id, i);
}
});
getTheImage(imageId: number, index: number) {
this.authService.getPersonImage(imageId).subscribe(data => {
this.createImageFromBlob(data, index);
this.isImageLoadingArr[index] = false;
console.log("loaded image:" + index);
}, error => {
this.isImageLoadingArr[index] = false;
console.log(error);
});
}
我像这样在我的组件中显示数据
<mat-grid-tile *ngFor="let person of results; let i = index;" class="animated flipInX">
<div class="image-background">
<img [src]="images[i]"
alt="" width="100%">
似乎所有加载图像数据的调用都没有运行同时进行。也就是说,每次,我都会收到日志消息
loaded image: 0
loaded image: 1
loaded image: 2
loaded image: 3
loaded image: 4
....
按顺序打印,让我相信调用不会同时执行。我如何修改我拥有的内容,以便同时执行获取图像源的调用,而不是一次执行一个?
我认为最好的方法是实现 forkJoin Rxjs 规范:
this.authService.getAllinLibrary().subscribe((res: any[]) => {
this.results = res;
...
let observableBatch = [];
results .forEach(( componentarray, key ) => {
observableBatch.push( this.getTheImage(res[key ].Id, key); );
});
const getImagesObservable= forkJoin(observableBatch );
getImagesObservable.subscribe({
next: value => your Implementation Here
complete: () => console.log('This is how it ends!'),
});
});
我正在使用Angular 9. 我想加载一系列对象,每个对象都有图像数据。我想先加载所有对象,然后再加载图像数据。我的 component.ts 文件中有这个 ngOnInit ...
ngOnInit(): void {
this.authService.getAllinLibrary().subscribe((res: any[]) => {
this.results = res;
...
for (let i = 0; i < results.length; i++) {
this.getTheImage(res[i].Id, i);
}
});
getTheImage(imageId: number, index: number) {
this.authService.getPersonImage(imageId).subscribe(data => {
this.createImageFromBlob(data, index);
this.isImageLoadingArr[index] = false;
console.log("loaded image:" + index);
}, error => {
this.isImageLoadingArr[index] = false;
console.log(error);
});
}
我像这样在我的组件中显示数据
<mat-grid-tile *ngFor="let person of results; let i = index;" class="animated flipInX">
<div class="image-background">
<img [src]="images[i]"
alt="" width="100%">
似乎所有加载图像数据的调用都没有运行同时进行。也就是说,每次,我都会收到日志消息
loaded image: 0
loaded image: 1
loaded image: 2
loaded image: 3
loaded image: 4
....
按顺序打印,让我相信调用不会同时执行。我如何修改我拥有的内容,以便同时执行获取图像源的调用,而不是一次执行一个?
我认为最好的方法是实现 forkJoin Rxjs 规范:
this.authService.getAllinLibrary().subscribe((res: any[]) => {
this.results = res;
...
let observableBatch = [];
results .forEach(( componentarray, key ) => {
observableBatch.push( this.getTheImage(res[key ].Id, key); );
});
const getImagesObservable= forkJoin(observableBatch );
getImagesObservable.subscribe({
next: value => your Implementation Here
complete: () => console.log('This is how it ends!'),
});
});