我研究了几个小时,但我找不到解决问题的办法。基本上,我正在尝试使用typescript处理离子项目中的401 Error。如果它发生,我需要刷新我的accessToken然后调用相同的功能。我制作了一个代码来完成这个技巧,但召回是在组件内进行的,这是一个糟糕的设计。如何回忆一个应该返回Observable的函数?
我的组件:
def solution[T](function1: => Try[Option[T]], function2: T => Try[Boolean]): Try[Option[Boolean]] = {
import cats.implicits._
for {
a <- function1
b <- a.map(function2).sequence[Try, Boolean]
} yield b
}
println(solution[String](Success(Some("s")), s => Success(true))) // Success(Some(true))
println(solution[String](Success(Some("s")), s => Failure(new RuntimeException))) // Failure(java.lang.RuntimeException)
println(solution[String](Success(None), s => ???)) // Success(None)
println(solution[String](Failure(new RuntimeException), s => ???)) // Failure(java.lang.RuntimeException)
我的提供商:
getInfos(){
this.userService.getInfosUser()
.subscribe(
response => {
console.log('success : ' , response); // Then do some logic
},
error => {
this.showErrorPage(error);
}
)
答案 0 :(得分:1)
我假设select()
返回一个promise,所以我们将它转换为一个observable。如果成功,我们会将this.authService.handleError()
的调用添加到该可观察对象。
getInfoUser()
你可能会在这里结束一个无限循环,所以你可以添加一些简单的重试逻辑:
getInfosUser(): Observable<Response> {
return this.authHttp.get(this.apiUrl+'getuserinfos')
.map((response: Response) => {
return response;
})
.catch((error: any) => {
if ( error.status === 401 || error.status === "401" ) {
return Observable.fromPromise(this.authService.handleError(error)).concat(getInfosUser());
}
else {
return Observable.throw( new Error(error.status) );
}
})
}