我在我的应用程序getServerData()中有一个函数,我从主页调用它,并将令牌作为param传递到我的API中,调用这个函数。
如果令牌是有效的,API将返回数据,否则它将返回带有令牌过期错误的未经授权的访问,此时,我用新生成的令牌调用同一个函数,形成另一个API,但是一些递归函数调用在Observable中不起作用。
有关更多细节,请查看下面的代码:
/**
* Get Search result from server.
*/
getServerData(searchText: string): Observable<any> {
let self = this;
return Observable.create(function(observer) {
self.getToken().then((token) => {
console.log('Token : ', token);
self.httpPlugin.get(self.url + searchText, {}, {}).then((response) => {
console.log("Response Success : " + JSON.stringify(response));
observer.next(jsonResponse);
}).catch(error => {
if (error.status == 403) {
//Call Same method Again
self.getServerData(searchText);
} else {
console.log("Error : " + error);
console.log("Error " + JSON.stringify(error));
observer.error(error);
}
});
}).catch((error) => {
observer.error(error);
console.log("Error : " + error);
})
});
}调用相同的函数时,不执行任何代码。
根据评论编辑:
我的订阅方式如下:
this.subscription = this.api.getServerData(this.searchString.toUpperCase()).subscribe((response: any) => {
console.log("back with data :-",response);
}, error => {
console.log("InLine Error : ",error);
});无法理解哪里出了问题,或者我在从Observable()调用函数时做错了什么。
在这方面指导我。
提前感谢!
发布于 2018-10-08 09:18:45
最后,经过大量的研究,我找到了解决问题的办法。
1的事情是,我需要更新我的rxjx库,因为我安装的rxjx版本是5.5.2,所以我将它升级到最新的5.5.11。
2的事情是,我将在没有subscribe()的情况下调用可观察到的Observable,所以它永远不会返回,所以我从错误块更新递归调用,在下面调用它的subscriber()。
getSearchData(){
this.subscription = this.api.getServerData(this.searchString.toUpperCase()).subscribe((response: any) => {
console.log("back with data :-",response);
}, error => {
if (response.status == 403) {
this.getSearchData();
}else{
console.log("InLine Error : ",response);
this.showAlert('Error', 'Something went wrong. please try again.');
}
});
}通过做以上两件事,我能够解决我的问题。
谢谢你对我问题的快速答复。
希望这能帮助像我这样面临同样问题的人。
发布于 2018-10-04 14:41:58
在可观察的范围内使用诺言是不好的做法。使用Obserable.fromPromise,也使用mergeMap。如果你使用。每当任何错误出现时,都是可以观察到的,它会抛出错误,你就能捕捉到。我将建议使用主题,而不是创建您自己的可观察的,并记住一件事,不订阅您的服务。希望它能帮上忙
https://stackoverflow.com/questions/52627507
复制相似问题