2017-02-17 56 views
0

我有一個認證服務來保存令牌,並且保存令牌的結果是承諾。我希望只有在承諾解決後才能將該值返回給其他函數。只有在承諾在angular2/ionic2中解決時才執行觀察

這是我authservice節省了令牌:

login(user: UserModel): Observable<any> { 
    return this._http.postnoAuth(this.loginurl + "mobile-login", body) 
     .map((response: Response) => { 
      let token = response.json() && response.json().access_token; 

      if (token){ 
       this._storage.set('currentUser', JSON.stringify({token: token})) 
       .then(res=>{ 
        return true; //return true after the promise is resolved 
       }); 
      } 
      else{ 
       return false; 
      } 
     }) 
    //.catch(this.handleError); 
} 

然後我訂閱上面:

this._authservice.login(this.user).subscribe(respose => { 
    if(response){ //expecting true here 
     console.log("true"); 
    } 
    else{ 
     console.log("false"); 
    } 
    loader.dismiss(); 
     this.submitted = false; 
    }, 
    error=> { 
     this.submitted = false; 
    } 
); 

以上代碼始終記錄錯誤,即使存儲的值已設置,什麼可能是錯誤的?

回答

1

我會嘗試通過flatMap運算符來做到這一點。該flatMap運營商幫助我們調用一個請求前一個結束之後:

不要foget這些進口:

import { Observable } from 'rxjs/Observable'; 
import 'rxjs/add/operator/map'; 
import 'rxjs/add/operator/mergeMap'; 
import 'rxjs/add/observable/of'; 

Plunker Example

0

你是返回兩個可觀察到的和來自Login()的布爾值。決定你想要返回的東西。

如果你想要一個布爾值,重新定義你的方法是這樣的:

login(user: UserModel): Boolean { 
    this._http.postnoAuth(this.loginurl + "mobile-login", body) 
     .map((response: Response) => { 
      let token = response.json() && response.json().access_token; 

      if (token){ 
       this._storage.set('currentUser', JSON.stringify({token: token})) 
       .then(res=>{ 
        return true; 
       }) 
       .catch((err) => { 
        console.log("Some error while setting storage :", err); 
        return false; 
       }); 
      } 
      else{ 
       return false; 
      } 
     }) 
    //.catch(this.handleError); 
} 

或者返回一個可觀察的。現在,我不確定postnoAuth()是否已經返回可觀察值。如果沒有,您可以創建新的,例如我已經回答here。例如。把你的代碼放在Observable.create(observer => {},(err)=>{});。然後,從您的呼叫方法訂閱login()並從此處設置爲存儲。所以,你的承諾將在調用方法。您的代碼會變成這樣:

login(user: UserModel): Observable<any> { 
    return Observable.create(observer => { 
     this._http.postnoAuth(this.loginurl + "mobile-login", body) 
     .map((response: Response) 
     .subscribe(data => { 
      observer.next(data); 
     }, 
     (err) => { 
      observerer.error(); 
     } 
    }); 
} 

而且從調用方法訂閱:

this._authservice.login(this.user).subscribe(respose => { 
    let token = response.json() && response.json().access_token; 
    if (token){ 
     this._storage.set('currentUser', JSON.stringify({token: token})) 
     .then(res=>{ 
      console.log(res); 
     }) 
     .catch((err) => { 
      console.log("Some error while setting storage :", err); 
     }); 
    } 
); 

我認爲你在找什麼,我的答案應該工作第1種方法。但是,第二種方法是我所建議的。第二場比賽的流程要容易得多。你的選擇。