angular2 rxjs可观察的forkjoin

时间:2016-06-27 08:11:54

标签: typescript angular rxjs observable

是否可以继续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;
  });
});

KAB

2 个答案:

答案 0 :(得分:31)

您可以利用每个observable的catch运算符来拦截错误,并在这种情况下返回另一个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({}),
);

答案 1 :(得分:5)

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

"library name"

但是你可以把你的额外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())
    );