2017-02-17 2 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()がすでにobservableを返すかどうかわかりません。それがなければ私は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); 
     }); 
    } 
); 

私はあなたが私の答えでは第一の方法を探しています何のために動作するはずだと思います。しかし、2番目の方法は、私が示唆しているものです。流れは2番目の方がはるかに簡単です。あなたの選択。

関連する問題