[英]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.