我有可观察到的nex流:
verifyFacebookUser2(): Observable<User> {
let userFacebook = {"type": "facebook", "id_facebook": this.userId};
return this._us.verifyRegisterFacebookObs(userFacebook )
.flatMap(token => {
if (!token) {
return Observable.of([])
}
else {
return Observable.fromPromise(this.storage.set('token', token));
}
}, error => {
error => console.log("FIRST ERROR" + JSON.stringify(error));
})
.catch(err => {
if (err.status === 404) {
throw new Error("404");
} else {
throw new Error("");
}
//return Observable.of([])
})
.flatMap(res => {
return Observable.fromPromise(this.storage.get('token'));
})
.flatMap(tokenStorage => {
let decodedToken = this.jwtHelper.decodeToken(JSON.stringify(tokenStorage));
let idUser = parseInt(decodedToken.id);
return this._ups.getUserProfileObs(idUser);
})
}
如您所见,如果所有流程都正常,我的可观察返回用户,我的服务verifyRegisterFacebookObs返回一个用户:
verifyRegisterFacebookObs(user): Observable<any> {
let url = URL_SERVICIOS + '/users/verify';
return this.http2.post(url, user)
.map(res => res['result'])
/*.catch(error => {
if (error.status === 404)
return Observable.of("");
})*/
}
因此,当一切正常时,此流运行良好,但是如果我的服务返回404错误,我该如何执行另一个流或可观察的流。
如果我的服务返回404错误,则表示该用户不存在,我需要 注册此用户并调用新的http请求
使用我做下一个:
this.verifyFacebookUser2()
.subscribe((user: User) => {
alert("OK");
}, error => {
alert(error);
// Can I call another function that call observable to do another flow ?
this.registerIdFacebook(this.userId);
})
如果一切正常,请打印ok,如果出现错误,我需要调用registerIdFacebook,因此,仅当this._us.verifyRegisterFacebookObs(userFacebook)及其404发出错误时,才调用registerIdFacebook。
registerIdFacebook(id) {
this._us.facebookRegisterObs({"id_facebook": id}).
subscribe(resultado => {
alert(JSON.stringify(resultado));
}, error => {
//TODO PRESENT TOAST
alert(JSON.stringify(error));
})
}
有人可以帮助我实现这一目标吗?
答案 0 :(得分:0)
您可以使用catchError:
您需要返回Observable
,因此请直接致电_us服务:
this.verifyFacebookUser2() {
.catchError(() => this._us.facebookRegisterObs({"id_facebook": id}))
.subscribe((user: User) => {
alert('OK');
}
或更改您的registerIdFacebook以返回服务方法:
registerIdFacebook(id) {
return this._us.facebookRegisterObs({"id_facebook": id})
.pipe(tap(
(resultado) => {
alert(JSON.stringify(resultado));
},
(error) => {
//TODO PRESENT TOAST
alert(JSON.stringify(error));
}));
}
this.verifyFacebookUser2() {
.catchError(() => this.registerIdFacebook(this.userId))
.subscribe((user: User) => {
alert('OK');
}
答案 1 :(得分:0)
我已经解决了我的问题,这就是答案:
1。首先,如果错误状态为404,我的服务必须返回observable:
verifyRegisterFacebookObs(user): Observable<any> {
let url = URL_SERVICIOS + '/users/verify';
return this.http2.post(url, user)
.map(res => res['result'])
.catch(error => {
if (error.status === 404)
return Observable.of("");
})
}
我修改了我的功能verifyFacebookUser
verifyFacebookUser():可观察{ 让userFacebook = {“ type”:“ facebook”,“ id_facebook”:this.userId};
return this._us.verifyRegisterFacebookObs(userFacebook)
.flatMap(token => {
if (!token) {
return this._us.facebookRegisterObs({"id_facebook": this.userId}).flatMap(user => {
return Observable.fromPromise(this.storage.set('token', user.token));
})
}
else {
return Observable.fromPromise(this.storage.set('token', token));
}
}, error => {
error => console.log("FIRST ERROR" + JSON.stringify(error));
})
.flatMap(res => {
return Observable.fromPromise(this.storage.get('token'));
})
.flatMap(tokenStorage => {
let decodedToken = this.jwtHelper.decodeToken(JSON.stringify(tokenStorage));
let idUser = parseInt(decodedToken.id);
return this._ups.getUserProfileObs(idUser);
})
}
如您所见,令牌是否不存在,我调用this._us.facebookRegisterObs,立即保存令牌以继续流程。
最后,我这样打电话:
this.subscription=this.verifyFacebookUser()
.subscribe((user: User) => {
this.processDataObs(user);
loading.dismissAll();
}, error => {
console.log("Error on flow ---" + error);
loading.dismissAll();
this.presentToast("Ups... ha ocurrido un error con facebook");
})
不要忘记取消订阅:
ionViewWillLeave() {
if (this.subscription)
this.subscription.unsubscribe();
}