angular 如何在每次迭代到下一个元素之前等待订阅响应
angular how to wait sucbribe response before for each iterate to next element
我的每个循环都有一个 pb。
我想遍历我的用户列表,对于每个用户,我都会调用 api 来获取其他一些统计信息。但是循环在第一个元素的调用响应之前转到下一个。
我不明白 for each 是同步的而不是订阅...所以我该怎么做?
这是我的代码源:
this.users.forEach(userid => {
this.httpClient.get(url).subscribe((res: DayStat[]) => {
res.forEach(y => {
// do some stuff
console.log('log1');
}
});
// do some others stuffs
console.log('log2');
});
console.log ('end loop');
// do some others stuffs;
日志顺序:
end loop;
log1
log2
感谢您的帮助!
是这样的吗?
const requests$: Observable<DayStat[]>[] = users.forEach(user => getUserById(user.id));
zip(...requests$).subscribe();
您可以使用 "await",如前所述:
Jeff,http.get 是异步的,所以你不知道它什么时候结束。
当我们想要有一系列的httpClient时,通常会使用forkJoin。在 forkJoin 内部,您拥有所有响应,例如
const obs=[];
this.users.forEach(userid => {
obs.push(this.httpClient.get(url))
}
//In obs we has an array of observables. when subscribe you get an array with the responses, e.g.
forkJoin(obs).susbcribe((result:any[])=>{
result.map((res,index)=>{
console.log(this.users[index], res)
})
})
发生这种情况是因为 http 请求是异步的,此解决方案应该有所帮助
async method() {
for (const userid of this.users) {
const res: DayStat[] = await this.httpClient.get(url).toPromise();
res.forEach(y => {
// do some stuff
console.log('log1');
});
console.log('log2');
}
console.log ('end loop');
// do some others stuffs;
}
我的每个循环都有一个 pb。
我想遍历我的用户列表,对于每个用户,我都会调用 api 来获取其他一些统计信息。但是循环在第一个元素的调用响应之前转到下一个。
我不明白 for each 是同步的而不是订阅...所以我该怎么做?
这是我的代码源:
this.users.forEach(userid => {
this.httpClient.get(url).subscribe((res: DayStat[]) => {
res.forEach(y => {
// do some stuff
console.log('log1');
}
});
// do some others stuffs
console.log('log2');
});
console.log ('end loop');
// do some others stuffs;
日志顺序:
end loop;
log1
log2
感谢您的帮助!
是这样的吗?
const requests$: Observable<DayStat[]>[] = users.forEach(user => getUserById(user.id));
zip(...requests$).subscribe();
您可以使用 "await",如前所述:
Jeff,http.get 是异步的,所以你不知道它什么时候结束。
当我们想要有一系列的httpClient时,通常会使用forkJoin。在 forkJoin 内部,您拥有所有响应,例如
const obs=[];
this.users.forEach(userid => {
obs.push(this.httpClient.get(url))
}
//In obs we has an array of observables. when subscribe you get an array with the responses, e.g.
forkJoin(obs).susbcribe((result:any[])=>{
result.map((res,index)=>{
console.log(this.users[index], res)
})
})
发生这种情况是因为 http 请求是异步的,此解决方案应该有所帮助
async method() {
for (const userid of this.users) {
const res: DayStat[] = await this.httpClient.get(url).toPromise();
res.forEach(y => {
// do some stuff
console.log('log1');
});
console.log('log2');
}
console.log ('end loop');
// do some others stuffs;
}