将返回错误的信号重定向到另一个信号



所以我的用例是,我有一个HTTP请求(使用-[NSURLSession rac_dataWithRequest:]触发),它可以返回状态码403。

当发生这种情况时,我想捕获它,并重定向到另一个请求身份验证令牌的SignalProducer。当SignalProducer成功完成时,我希望重定向回原始的rac_dataWithRequest。

我怎么做最好?我用的是reactivecocoa4。2.

您是否需要在重试之前将身份验证令牌交还给原始请求?如果是,那么这对你没有帮助,对不起。

我假设您只需要触发一次身份验证请求,然后重试原始请求。例如,您的认证请求设置HTTP客户端的HTTP授权头,以便下一个请求自动授权…

这个要点有一个Playground的内容来说明解决方案。这个要点是我四处寻找解决方案的结果,请求被嘲笑,…

假设您的请求有一个SignalProducer:

let request =  SignalProducer<Response, NSError> { 
    // Perform your request that needs authentication here
}

另一个用于您的身份验证请求:

let authorize =  SignalProducer<Void, NSError> { 
    // Perform your request that needs authentication here
}

现在你可以使用flatMapErrors(以前的catch)和retry:

request.flatMapError { error -> SignalProducer<String, NSError> in
    if(error.code == 403) {
        return authorize.then(SignalProducer(error: error))
    } else {
        return SignalProducer(error: error)
    }
}.retry(1)
因此,我们捕获原始请求的错误,如果错误码是403,我们执行authorize请求。然后,我们仍然转发捕获到的错误。否则,我们只是转发错误。在authorize请求之后转发错误非常重要,否则retry不会重新启动原始请求。

然而,这个问题是,它将重试每个错误,而不仅仅是当原始请求返回403

最新更新