在错误404之后,我的流停止在RxJs中工作

时间:2016-03-18 00:51:15

标签: javascript rxjs

我正在努力学习RxJs。我有这个工作代码,但在一个AJAX错误后,一切都停止工作。

(function($, _) {
  var alertBox = $('.alert-box');
  alertBox.hide();
  var fetchRepoButton = $('.fetch-repo');

  var organization = $('#organization');
  var repositories = $('.repositories');

  var fetchRepoClickStream = Rx.Observable.fromEvent(fetchRepoButton, 'click');

  var requestStream = fetchRepoClickStream.map(function() {
    var theOrg = organization.val();
    return '/api/orgs/' + theOrg;
  });

  var responseStream = requestStream.flatMap(function (requestUrl) {
    return Rx.Observable.fromPromise($.getJSON(requestUrl)).catch(function() {
      alertBox.fadeIn('fast').delay(500).fadeOut('slow');
      return Rx.Observable.Empty();
    });
  });

  var renderRepositories = function(repos) {
    // render DOM
  }

  responseStream.subscribe(function (repos) {
    renderRepositories(repos); 
  });

})($, _);

如何从AJAX错误中恢复?

1 个答案:

答案 0 :(得分:1)

这可能是因为当您从Rx.Observable.Empty();返回flatMap时,实际上是在终止流。您可以返回错误并将其处理到下游,而不是结束流。

但最后,你的问题的答案将取决于对你有意义的事情(你可以用指数增加的延迟重试多次,你可以中止并继续其他事情等等)。

一般来说,有各种运营商帮助进行错误管理。对于使用Rxjs进行更深入的错误管理,这绝对是一个很好的起点:https://xgrommx.github.io/rx-book/content/getting_started_with_rxjs/creating_and_querying_observable_sequences/error_handling.html

有趣的运营商包括:

  • 重试/ retryWhen
  • 捕获/最后

有关该主题的有趣链接: