簡體   English   中英

僅當在angular2 / ionic2中解決了承諾時才執行可觀察對象

[英]Executing an observble only when a promise is resolved in 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;
    }
);

即使設置了存儲值,上述代碼也始終記錄為false,這可能是什么問題?

我會嘗試通過flatMap運算符執行此操作。 flatMap運算符可幫助我們在前一個請求完成后調用一個請求:

return this._http.get('app/test.json')
  .flatMap((response: Response) => {
    let token = response.json() && response.json().access_token;

    if (token) {
      return this._storage.set('currentUser', JSON.stringify({ token: token }))
        .then(res => {
          return true;
        });
    } else {
      return Observable.of(false);
    }
  });

不要混淆這些進口:

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

柱塞示例

您正在從Login()返回Observable和boolean值。 確定您要退貨的內容。

如果需要布爾值,請按以下方式重新定義方法:

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.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);
        });
    }
);

我認為您在我的答案中尋找的第一種方法應該有效。 但是,第二種方法是我建議的。 第二個流程要容易得多。 你的選擇。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM