Angular 在URL请求后订阅Observable
请原谅我的行话,如果我没有使用正确的主题和观察词汇 无论如何,我想做的是在订阅新图片时获得一个图片列表。当前在控制台中,我的响应是 [] [3] [7] [9] 其中,每个数字都是数组的长度。这是正确的。9是正确的长度数组,我正在获取图像列表 但是!我只想把控制台打印出来[9]。我不知道为什么我订阅了4次 我如何延迟订阅直到forEach循环完成,这样我就不会多次订阅 我担心在HTML组件中显示图像时可能会遇到问题Angular 在URL请求后订阅Observable,angular,Angular,请原谅我的行话,如果我没有使用正确的主题和观察词汇 无论如何,我想做的是在订阅新图片时获得一个图片列表。当前在控制台中,我的响应是 [] [3] [7] [9] 其中,每个数字都是数组的长度。这是正确的。9是正确的长度数组,我正在获取图像列表 但是!我只想把控制台打印出来[9]。我不知道为什么我订阅了4次 我如何延迟订阅直到forEach循环完成,这样我就不会多次订阅 我担心在HTML组件中显示图像时可能会遇到问题 export class ViewComponent implements On
export class ViewComponent implements OnInit {
constructor(private data: Masterdata) { }
ngOnInit() {
this.data.currentMessage.subscribe(message => this.message = message);
}
getBabies() {
this.data.getBabiesById().subscribe(
data => {
this.BabiesRooms = data;
data.forEach((element) => {
this.data.getImagesByBabyId(String(element.idbabyroom)).subscribe();
});
});
console.log("ASDF");
this.data.newImages.subscribe(data => console.log(data));
}
}
编辑:让我重新措辞一下。方法getBabies()中有两个订阅
我只希望在第一个订阅完成后调用第二个订阅 基本上,您可以使用
rxjs
forkJoin。使用映射将列表存储在数组中,而不是forEach
。下面是你应该尝试的方法
let someVar = data.map((element) => {
return this.data.getImagesByBabyId(String(element.idbabyroom));
});
});
const result = forkJoin(someVar)
.subscribe(res => {
// Here you will get the result in the form of array
// such as
// console.log(res[0], 'res[0]') is first res of subscription stored in array and so on...
// console.log(res[1], 'res[1]')
// console.log(res[res.length - 1]) // to get the last item
})
有关的详细信息,您可以使用forkjoin实现:
Observable.forkJoin(
this._myService.makeRequest('Request One', 2000),
this._myService.makeRequest('Request Two', 1000),
this._myService.makeRequest('Request Three', 3000)
)
.subscribe(([res1, res2, res3]) => {
this.propOne = res1;
this.propTwo = res2;
this.propThree = res3;
});
您还可以使用Rxjs flatMap执行相同的操作:
import { switchMap } from 'rxjs/operators';
getBabies() {
return this.data.getBabiesById().do(response => {
// do something with above response
this.BabiesRooms = response;
}).flatMap(response => {
response.forEach((element) => {
this.data.getImagesByBabyId(String(element.idbabyroom)).subscribe();
});
})
}
与其循环查看
数据
,为什么不直接获取数据[data.length-1]
?这样每个IDBAByROM都会进行一个单独的URL调用。好的,那么您想进行所有调用,但只关心最终的响应?正确。所以我非常希望在调用第二个订阅之前完成第一个订阅。