Piszę aplikację kątową. Mam usługę, która sprawia, że żądanie HTTP w ten sposób:

export class PingService {

  constructor(
    private http: HttpClient) { }

  ping() {
    return this.http.get<{ip, type}>(this.apiRoutes.pingService);
  }
}

Nazywam tę usługę w komponencie:

login(credentials) {
    this.invalidLogin = false;

    this.pingService.ping()
      .subscribe(data => {
        this.apiConfigService.changeNetwork(data.type);
      },
      error => {
        throw(error);
      });

    // MORE THINGS TO DO //

Chcę czekać na zakończenie pingService.ping() przed wykonaniem // MORE THINGS TO DO //. Jak mogę czekać na zakończenie usługi?

0
Juan 4 czerwiec 2018, 12:10

4 odpowiedzi

Najlepsza odpowiedź
login(credentials) {
    this.invalidLogin = false;

    this.pingService.ping()
      .subscribe(data => {
        this.apiConfigService.changeNetwork(data.type);
        this.doMoreThings();
      },
      error => {
        throw(error);
      });
}

doMoreThings() {
  console.log('I am doing more things');
}
2
user4676340user4676340 4 czerwiec 2018, 09:14

Chciałbym dodać coś w odniesieniu do innych odpowiedzi.

Przez większość czasu nie powinieneś "czekać na żądania HTTP" w dowolnej aplikacji JavaScript, ponieważ może zablokować UI. Wyobraź sobie, że Twój użytkownik wykonuje jakieś działania na swojej aplikacji, podczas gdy istnieje utrata połączenia lub zła sieć. Spowodowałoby to zablokowane interfejs użytkownika, dopóki nie zostanie zakończone żądanie lub razy, co jest naprawdę złym doświadczeniem.

0
Guerric P 5 czerwiec 2018, 11:34

Synchroniczny nie jest polecany z JavaScript, zwłaszcza gdy robisz żądania HTTP. Sposób, w jaki faceci napisali już najlepszy sposób na to.

0
MladenB 4 czerwiec 2018, 09:25
login(credentials) {
this.invalidLogin = false;

this.pingService.ping()
  .subscribe(data => {
    this.apiConfigService.changeNetwork(data.type);

    --> To here // MORE THINGS TO DO //
  },
  error => {
    throw(error);
  });

--> Move this    // MORE THINGS TO DO //
1
user5283119user5283119 4 czerwiec 2018, 09:13