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

标签 javascript typescript rxjs reactive-programming observable

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

我的示例有点做作,但我的实际实现有点太复杂,无法在此处展示。无论如何,我有 someObservable,它会在用户点击 UI 时发出值。这应该会触发对 API 的请求(GET/POST/等)。问题在于,如果 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

最佳答案

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

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

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

关于javascript - 如何从 rxjs 中的错误中恢复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42642966/

相关文章:

javascript - Hangman 游戏将用户选择的字母与要猜测的单词中的字母进行比较

node.js - 在 Angular 中调用外部应用程序

angular - 如何在http调用 Angular 2的catch block 中读取响应主体

Angular 2 Observable http 服务错误处理

html - ion-infinite-scroll 极少发射

redux-observable 无法从发出的 Action 中捕获错误,错误停止 Action 流

javascript - 根据一列值隐藏行

javascript - Bind() 到动态嵌入的 soundcloud 小部件

php - 在 php 中运行 javascript

typescript - 为什么 TypeScript 中的 keyof word 在 2 `type defination` 秒内表现不同?