如何使用Angular处理RxJS中的错误

时间:2015-07-16 14:18:09

标签: javascript angularjs reactive-programming rxjs reactive-extensions-js

我正在开发一个Angular应用程序,该应用程序显示从RESTful API获取的项目列表。列表的内容取决于查询。 可以通过填写输入字段,使用提交按钮或将其作为查询参数添加到URL来传递查询。

为了确保所有内容按顺序运行并防止出现异步问题,我正在使用RxJS

现在我想知道如何处理错误,因为它们可能发生在流的中间,例如。当HTTP请求失败时。

查询作为输入流

这是两个var nonAllowedFilesNames = directory.EnumerateFiles() .Select(file => file.Name) .Where(fileName => !allowedFiles.Contains(fileName)); if(nonAllowedFilesNames.Any()) { string unallowedFiles = String.Join(",", nonAllowedFilesNames); Message.Warning("Unallowed files found ! Please remove: " + unallowedFiles); } ,它们都发送一系列查询。

Observables

获取结果

更改查询后,// first observable for the submit button submitFormObservable = $scope.$createObservableFunction('search'); // second observable for when the input value changes inputObservable = $scope.$toObservable('query') .map(function (change) { return change.newValue; }); 会触发,并从API中获取结果。

Observable

处理错误

现在我不知道如何处理错误,例如。 var mainStream = Rx.Observable.merge([submitFormObservable, inputObservable]) .where(function (query) { return query && query.length > 0; }) .debounce(400) .distinctUntilChanged() .select(getResultsForQuery) .switchLatest(); 抛出错误。 我想显示错误而不是结果,但是阻止getResultsForQuery处理新事件。

目前我通过从Observable创建两个新流来解决它,一个用于在成功时处理结果,一个用于在发生错误时处理结果。查询无效时的响应数据包含Observable属性。

成功案例

error

错误信息流

// stream containing the album information from LastFm
mainStream
  .filter(function (response) {
    return !response.data.error;
  })
  .map(function (response) {
    return response.data.result;
  })
  .subscribe(function (result) {
    $scope.error = undefined;
    $scope.result = result;
  });

可能的解决方案

  1. 我已经阅读了throwing and catching errors,但问题是流似乎在第一次出错后停止并且没有触发新事件。

  2. 使用mainStream .filter(function (response) { return response.data.error; }) .map(function (response) { return response.data; }); .subscribe(function (error) { $scope.result = []; $scope.error = error; }); described in the docs来忽略错误并确保错误后流继续。但我无法找到正确处理'的方法。错误并将其显示给最终用户。

  3. 问题

    对于如何在这种情况下处理错误,是否有推荐的方法?是否有必要为此创建两个流,或者是否建议抛出异常?

    用户知道出现问题非常重要,并且在第一次出错后流不会停止。

1 个答案:

答案 0 :(得分:4)

捕获逻辑的问题在于它有效地终止了它之前的序列,这就是为什么如果你在顶级流中使用它,它将在一个异常之后停止。我建议你将catch逻辑包装在Spree::Order.state_machine.after_transition to: :complete, do: :update_user_credit def update_user_credit credit_used = self.credit_used initial_credit = self.user.credit self.user.update(credit: initial_credit - credit_used) end 中。然后,您可以捕获内部流并转换数据以符合下游flatMapLatest期望的内容。

这样的事情:

observers