使用刷新令牌处理401错误并调用相同的函数

时间:2017-06-22 15:03:53

标签: javascript http typescript promise observable

我研究了几个小时,但我找不到解决问题的办法。基本上,我正在尝试使用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);
    }
  )

1 个答案:

答案 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) );
        }
    })
}