2016-07-08 24 views
10

In una pagina di login, ho questa funzione al momento della presentazione della pagina:Angular 2, come usare setTimeout?

checkLogin(){ 
    this.x_userS.getLogin(this.x_userO.login_name, this.x_userO.pwd_plain).then(response => this.x_userO=response); 
    (function(){ 
     setTimeout(() => { 
      if (this.x_userO.login_status == "1") { 
       this.x_companyS.getCompanyByUser(this.x_userO.user_id).then(response => this.x_companyO=response); 
       (function(){setTimeout(() => { 
        this.x_userS.setUser(this.x_userO); 
        this.x_companyS.setCompany(this.x_companyO); 
        this.router.navigate(['HomePage']); 
       }, 2000); 
      })(); 
      } 
      else { 
       window.alert("oops"); 
      } 
     }, 2000); 
    })(); 
} 

dove x_userS è il servizio di accesso e x_userO è l'oggetto utente. Sto cercando di dare le promesse due secondi per restituire i dati prima di elaborarli. Senza il setTimeout, non lo restituisce in tempo.

Ho provato a rimuovere tutto tranne l'avviso e verificato che è successo dopo due secondi. Tuttavia, non riconosce nessuna delle altre cose all'interno di function() {}, quindi credo di dover passare tutti i miei servizi e oggetti.

Qualcuno sa come fare?

+0

Credo che si usi $ timeout – user5680735

+0

Il timeout $ è solo per Angular 1; vedi http://stackoverflow.com/a/40402767/132374 –

risposta

21

Se si utilizza function(), quindi this. non punterà alle variabili della classe. Usa () => invece ovunque.

Il (function(){ ... })() su setTimeout() sembra essere ridondante comunque.

+1

grazie, ho rimosso la parte function() e funziona bene con 'this'. Stavo seguendo un esempio e lui ha usato la funzione (j) per passare un numero j, ho pensato che se non avessi voluto passare nulla avrei lasciato la funzione as(). – Yifan

+1

Sì, le funzioni freccia ti danno il diritto in questo contesto per questo problema. Grazie! –