1

我有一個Angular 4登錄應用程序。我已經在login.cmponent.ts文件中寫入了訪問邏輯,並訪問了我的login.service.ts文件,該文件又調用了一個身份驗證服務。如何在組件方法中同步調用Angular 4

當我從我的登錄組件調用身份驗證方法時,它返回false。當它執行剩餘的代碼時,認證服務返回true,因爲我們知道Angular運行代碼以異步的方式。

這是我的代碼:

登錄分量法:

this.loginService.setLoginData(
    new LoginModel(this.userId, this.bankId, this.password) 
).checkIfLoginSuccessfull(); 

Login.service方法:

this.authService 
    .attemptAuth(credentials); 

驗證服務的方法:

attemptAuth(credentials): void { 

    this.restService 
    .post('/authenticate', credentials) 
    .subscribe(
    data => this.setAuth(data.token), 
    err => this.destroy()); 

} 

代碼工作鰭即但是我想在執行checkIfLoginSuccessfull()的那一刻得到結果。我知道我沒有做或調用方法(Observables正確)。

請幫忙。 :)

+1

不能從異步逃脫。將異步調用轉換爲同步調用是不可能的(也是不可取的)。 –

+0

不要試圖使呼叫同步,而是學習如何鏈接承諾和觀察。有很多教程。這是最常見的問題之一。這個問題沒有包含足夠的代碼來提出具體的建議。 –

+0

這只是3級方法調用。最後一個authService正確執行代碼。我如何鏈接它們,以便在執行該行時,在第一個LoginComponent方法中訪問所需的結果。 – user3095179

回答

3

你應該圍繞這個

this.restService 
    .post('/authenticate', credentials) 
    .subscribe(
     data => this.setAuth(data.token), 
     err => this.destroy()); 

到 「Observable.create」。

Observable.create(observer => { 
    this.restService 
    .post('/authenticate', credentials) 
    .finally(f => observer.complete()) 
    .subscribe(
     data => observer(data.token) 
     err => observer.error(err); 
} 

然後

​​
+0

這是拋出錯誤,Observer不是一個函數。 – user3095179

+0

'attemptAuth(credentials):Observable { this.purgeAuth(); 返回Observable.create(觀察者=> { this.restService.post( '/身份驗證',憑證) 。最後(observer.complete()) .subscribe( 數據=> { 觀察者(data.token ); 的console.log( '觀察:' + data.token); }, ERR => observer.error(ERR) ) })' – user3095179

+0

在頁面的頂部添加這樣的:進口{可觀察} from「rxjs/Rx」; –