【问题标题】:angular2 rxjs observable forkjoinangular2 rxjs 可观察 forkjoin
【发布时间】:2016-10-29 03:59:54
【问题描述】:

即使其中一个请求失败,是否可以继续 forkjoin http.get 请求。

我正在寻找 angular2 中 $q.allSettled 的类似功能。

查看示例:http://jsfiddle.net/Zenuka/pHEf9/

angular.module('qAllSettled', []).config(function($provide) {
  $provide.decorator('$q', function($delegate) {
    var $q = $delegate;
    $q.allSettled = function(promises) {
      return $q.all(promises.map(function(promise) {
        return promise.then(function(value) {
          return { state: 'fulfilled', value: value };
        }, function(reason) {
          return { state: 'rejected', reason: reason };
        });
      }));
    };
    return $q;
  });
});

卡布

【问题讨论】:

    标签: typescript angular rxjs observable


    【解决方案1】:

    使用 Observable.forkJoin() 来运行多个并发 http.get() 请求。 如果任何单个请求失败,整个操作将导致错误状态。

     getBooksAndMovies() {
        return Observable.forkJoin(
          this.http.get('/app/books.json').map((res:Response) => res.json()),
          this.http.get('/app/movies.json').map((res:Response) => res.json())
        );
    

    但您可以将额外的 GET 请求放入错误处理程序中:

    getBooksAndMovies() {
        Observable.forkJoin(
            this.http.get('/app/books.json').map((res:Response) => res.json()),
            this.http.get('/app/movies.json').map((res:Response) => res.json())
        ).subscribe(
          data => {
            this.books = data[0]
            this.movies = data[1]
          },
          err => console.error(err)
        );
    

    【讨论】:

    • 感谢您的回复,您能举个例子吗?
    • downvote,因为这并不能解决 OP 的问题,即如果其中一个请求失败,如何继续请求。 forkJoin 是等待非失败请求完成还是立即失败?
    • @AngJobs 有没有办法处理每个数组元素的错误?我需要使用失败的特定元素的错误消息更新 UI。我在 res: 块之后添加了一个 (err) => {} 但它只是跳转到整个数组的最终失败
    【解决方案2】:

    在这种情况下,您可以利用 catch 运算符为每个 observable 拦截错误并返回另一个 observable。

    这是一个示例:

    return Observable.forkJoin(
      this.http.get('/some-url')
             .map((res:Response) => res.json())
             .catch(res:Response => Observable.of({}),
      this.http.get('/some-other-url')
             .map((res:Response) => res.json())
             .catch(res:Response => Observable.of({}),
    );
    

    【讨论】:

    • 返回 null\undefined\{} 反对只返回 empty() 或使用 rxjs 过滤器非常烦人,但 empty() 或 filter() '不使用 forkJoin 原因需要“到要求所有源 Observable 发出至少一个值”,如 stackoverflow.com/a/50130620/9928564 中所述。可悲的是在 2020 年使用“这种”方法
    猜你喜欢
    • 1970-01-01
    • 2017-07-01
    • 2020-04-26
    • 1970-01-01
    • 1970-01-01
    • 2018-03-06
    • 2018-02-26
    • 2019-06-28
    • 1970-01-01
    相关资源
    最近更新 更多