如何从rxjs中的错误中恢复?

时间:2017-03-07 07:52:28

标签: javascript typescript rxjs reactive-programming observable

我正在尝试了解如何使用可观察序列以及如何从错误中恢复。

我的例子有点做作,但我真正的实现有点太复杂了,无法在这里展示。无论如何,当用户点击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"));
  }
}

http://jsbin.com/naroyeyive/3/edit?js,console

1 个答案:

答案 0 :(得分:4)

如果您想再次发送请求,可能需要查看retryretryWhen而不是catch

catch将使用返回的Observable作为新的“来源”。 See this bin for an example.

根据您传递给运营商的配置,

retry(When)将在发生错误时“重新订阅”。您可以在此处找到示例和更多信息:https://www.learnrxjs.io/operators/error_handling/retrywhen.html