簡體   English   中英

RxSwift-遞歸可觀察量?

[英]RxSwift - Recursive Observables?

學習RxSwift-這是我的問題:

我有一個Web服務,每當令牌過期時,都會使用活動訪問令牌來獲取數據,然后先調用令牌生成api,然后再調用當前請求以再次運行。 以便它具有有效結果的有效訪問令牌。

但是我在獲取令牌響應時遇到問題,然后致電prev。 請求?

所以我嘗試添加一個可觀察的請求,然后作為響應檢查令牌是否無效,然后調用另一個可觀察的返回活動令牌,一旦接收到令牌,再次調用較舊的請求。

func apirequest(_ urlConvertible:URLRequestConvertible) -> Observable<[String:AnyObject]> {
  return Observable.create({ observer  -> Disposable in
         let _ = Alamofire.request(urlConvertible).responseJSON  
                      { response in 
         if isTokenExpired() {
             self.generateToken().subscribe(onNext: response {
               self.apirequest(oldRequest)
          })
        }
      }
      return Disposables.create()
   })
}

我期待像任何Rx運營商或任何想法嘗試?

謝謝

我寫了一篇有關如何執行此操作的文章: https : //medium.com/@danielt1263/retrying-a-network-request-despite-having-an-invalid-token-b8b89340d29

用以下方式包裝您的網絡調用代碼:

/// Builds and makes network requests using the token provided by the service. Will request a new token and retry if the result is an unauthorized (401) error.
///
/// - Parameters:
///   - response: A function that sends requests to the network and emits responses. Can be for example `URLSession.shared.rx.response`
///   - tokenAcquisitionService: The object responsible for tracking the auth token. All requests should use the same object.
///   - request: A function that can build the request when given a token.
///   - Returns: response of a guaranteed authorized network request.
public func getData<T>(response: @escaping (URLRequest) -> Observable<(response: HTTPURLResponse, data: Data)>, tokenAcquisitionService: TokenAcquisitionService<T>, request: @escaping (T) throws -> URLRequest) -> Observable<(response: HTTPURLResponse, data: Data)> {
return Observable
        .deferred { tokenAcquisitionService.token.take(1) }
        .map { try request($0) }
        .flatMap { response($0) }
        .map { response in
            guard response.response.statusCode != 401 else { throw TokenAcquisitionError.unauthorized }
            return response
        }
        .retryWhen { $0.renewToken(with: tokenAcquisitionService) }
}

本文和隨附的要點展示了如何編寫tokenAcquisitionService並包括單元測試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM