我正在尝试了解如何使用可观察序列以及如何从错误中恢复。
我的例子有点做作,但我真正的实现有点太复杂了,无法在这里展示。无论如何,当用户点击UI时,我someObservable
会发出值。这应该触发对API的请求(GET / POST / etc)。问题是如果API返回错误,则在此之后不再调用postData
。
我在这里举例说明问题。我发现我可以使用Rx.Observable.of
代替Rx.Observable.throw
来保持运行状态。但是这将为subscribe
函数发出一个值。在我的真实应用程序中,postData
是一个由应用程序的多个部分重用的服务,我不确定是否要在那里使用of
而不是throw
。
所以我的问题是,你通常如何处理这些事情?
let someObservable = Rx.Observable.timer(1, 1000);
someObservable
.switchMap(data => {
return postData(data);
})
.catch(error => {
console.log("POST failed");
})
.subscribe(val => console.log("Success: " + val));
function postData(data) {
console.log("Will post " + data);
if (data !== 2) {
return Rx.Observable.of(true);
}
else {
return Rx.Observable.throw(new Error("400 Bad Request or something"));
}
}
答案 0 :(得分:4)
如果您想再次发送请求,可能需要查看retry
和retryWhen
而不是catch
。
catch
将使用返回的Observable
作为新的“来源”。 See this bin for an example.
retry(When)
将在发生错误时“重新订阅”。您可以在此处找到示例和更多信息:https://www.learnrxjs.io/operators/error_handling/retrywhen.html