我是RX的新手,我正在尝试理解如何在需要用户输入的错误之后继续执行任务。
一个具体的例子是双因素身份验证。我们有一个身份验证服务和一个受保护的资源。登录后,我们从auth-service接收LOA-2(使用的用户名和密码)令牌。尝试从受保护资源中获取数据时,我们收到一条错误消息,指出我们需要LOA-3(双因素)。因此,我们必须从用户那里获取输入,将其发送到auth-service,获取新令牌(LOA-3)并使用新令牌重试我们的获取调用。
登录有很多例子,但我无法绕过连续的链,这需要用户输入。
有什么想法吗?谢谢:))
答案 0 :(得分:0)
您需要使用catchError
函数从错误中恢复并启动一个新的observable来启动替代行为。
例如,您需要一个获取用户名和密码的生产者......
let credentialInput = Observable.combineLatest(usernameLabel.rx_text, passwordLabel.rx_text)
您可能希望等到用户点按“登录”按钮...
let credentials = credentialInput.sample(loginButton.rx_tap)
然后获取令牌。
let loaToken = credentials.flatMap { serverLogin($0, $1) }.catchError { error in
if error == loa3Error {
return getLOA3Data().flatMap { loa3ServerLogin($0) }
}
else {
throw error
}
}
getLOA3Data
是一个返回Observable的函数,该Observable包含loa3身份验证所需的数据。
上面当然是伪代码,但我希望它会让你对如何解决这个问题有所了解。