2016-06-27 42 views
11

Có thể tiếp tục yêu cầu http.get forkjoin ngay cả khi một trong các yêu cầu không thành công.angular2 rxjs forkjoin quan sát

Tôi đang tìm kiếm một hàm tương tự của $ q.allSettled in angular2.

Xem ví dụ: 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

Trả lời

6

Sử dụng Observable.forkJoin() để chạy nhiều http.get đồng thời() yêu cầu. Toàn bộ thao tác sẽ dẫn đến trạng thái lỗi nếu bất kỳ yêu cầu nào không thành công.

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()) 
    ); 

Nhưng bạn có thể đặt yêu cầu GET bổ sung của bạn trong xử lý lỗi:

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) 
    ); 
+0

Cảm ơn đã trả lời, bạn có thể cung cấp một ví dụ? – kabus

+6

downvote vì điều này không giải quyết được câu hỏi của OP về cách tiếp tục các yêu cầu nếu một trong số chúng không thành công. ForkJoin có chờ đợi hoàn thành các yêu cầu không thất bại hay không ngay lập tức không tự? – corolla

+0

@AngJobs Có cách nào để xử lý các lỗi cho từng phần tử mảng không? Tôi cần cập nhật giao diện người dùng với thông báo lỗi cho phần tử cụ thể không thành công. Tôi đã thêm một (err) => {} sau khi res: block nhưng nó chỉ nhảy đến thất bại cuối cùng cho toàn bộ mảng –

24

Bạn có thể tận dụng các nhà điều hành catch cho mỗi quan sát để đánh chặn các lỗi và gửi lại khác quan sát được trong những trường hợp như vậy.

Đây là một mẫu:

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({}), 
); 
Các vấn đề liên quan