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;
}