angular как ждать ответа от взятки перед каждой итерацией до следующего элемента - PullRequest
0 голосов
/ 05 мая 2020

У меня пб с моим на каждый л oop.

Я хочу перебрать свой список пользователей, и для каждого из них нужно выполнить вызов iia api, чтобы получить некоторую другую статистическую информацию. но l oop go to next перед ответом на вызов первого элемента.

Я не понимаю, что 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

спасибо за вашу помощь!

Ответы [ 4 ]

1 голос
/ 05 мая 2020

Джефф, 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)
   })
})
0 голосов
/ 05 мая 2020

Это происходит из-за асинхронности 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;
}
0 голосов
/ 05 мая 2020

Вы можете использовать "ожидание", как уже упоминалось здесь: { ссылка }

0 голосов
/ 05 мая 2020

Что-то вроде этого?

const requests$: Observable<DayStat[]>[] = users.forEach(user => getUserById(user.id));
zip(...requests$).subscribe();
...