【问题标题】:How to recover from errors in rxjs?如何从 rxjs 中的错误中恢复?
【发布时间】:2017-07-27 08:18:54
【问题描述】:

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

我的示例有点做作,但我的实际实现有点过于复杂,无法在此处展示。无论如何,我有someObservable,当用户在 UI 中单击时会发出值。这应该会触发对 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

【问题讨论】:

  • 立即捕获:return postData(data).catch(...) 修改后的 bin:jsbin.com/rujakoguro/3/edit?js,console
  • @arturgrzesiak 好的,这似乎有效!你认为你可以写一个答案并简要解释为什么我需要赶上那里而不是像我在我的代码中那样做?

标签: javascript typescript rxjs reactive-programming observable


【解决方案1】:

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

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

retry(When) 将根据您传递给操作员的配置在发生错误时“重新订阅”。您可以在此处找到示例和更多信息:https://www.learnrxjs.io/operators/error_handling/retrywhen.html

【讨论】:

  • Catch 不会终止流,如果它返回 observable 随后产生值。这绝对是一个恢复点
  • 是的,你是对的。我指的是乔尔使用.catch() 的方式。更新我的答案以澄清。
猜你喜欢
  • 1970-01-01
  • 2017-03-19
  • 1970-01-01
  • 2012-01-21
  • 1970-01-01
  • 1970-01-01
  • 2022-01-10
  • 2023-03-03
  • 2016-06-19
相关资源
最近更新 更多