2016-03-15 26 views
6

Tôi đang viết một ứng dụng sẽ giám sát số bản dựng hiện tại của tất cả các ứng dụng của chúng tôi trên các máy chủ khác nhau. Điều này được thực hiện bằng cách thực hiện một yêu cầu http cho một tệp txt trong mọi ứng dụng. Tôi đang làm điều đó bằng cách sử dụng một vòng lặp foreach.Cách biết khi nào tất cả các cuộc gọi HTTP Angular2 được hoàn thành

Vấn đề tôi gặp phải là tôi không chắc chắn cách sử dụng (Observables) để biết khi nào tất cả các yêu cầu được hoàn tất.

Khi yêu cầu quay lại, tôi thêm phản hồi làm thuộc tính của một mảng đối tượng. Sau đó, khi tôi có tất cả dữ liệu, tôi liên kết nó với mẫu của thành phần, nơi nó được lọc theo đường ống. Vì vậy, tôi cần đảm bảo rằng tôi không ràng buộc nó cho đến khi tất cả dữ liệu được hoàn thành.

Sau đây là cách tôi nhận được dữ liệu:

this.apps.forEach(app => { 
    app.Environments.forEach(env => { 
    this._buildMonitorService.getBuilds(env.URL) 
     .subscribe((data) => {  
     setupBuilds(this.apps,data.url,data._body); 
     });     
    }); 
}); 

setupBuilds thêm phản ứng với mảng của tôi về các ứng dụng.

Điều tôi đang tìm là một cách hiệu quả một Promise.all nơi tôi sẽ ràng buộc this.builds để thiết lập dữ liệu trong setupBuilds nhưng tôi không biết làm thế nào để làm điều đó với rxjs quan sát

Trả lời

14

Observable.forkJoin là tương đương với Promise.all nhưng đối với các quan sát.

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

Dưới đây là cách bạn có thể cấu trúc lại mã của bạn:

var observables = []; 
this.apps.forEach(app => { 
    app.Environments.forEach(env => { 
    observables.push(this._buildMonitorService.getBuilds(env.URL)); 
    }); 
}); 

Observable.forkJoin(observables).subscribe(
    (result) => { 
    result.forEach((data) => { 
     setupBuilds(this.apps,data.url,data._body); 
    }); 
    } 
); 

Bằng cách này bạn sẽ được đảm bảo rằng tất cả các yêu cầu đã được thực hiện khi cuộc gọi lại được đăng ký trong phương thức đăng ký được gọi là ...

+0

Vì vậy, tôi đã thử thiết lập này (đầu tiên theo cách của riêng tôi và sau đó một lần nữa với mã chỉnh sửa của bạn), và tôi nhận được 'Observable_1.Observable.forkJoin không phải là một chức năng' –

+0

Tôi nghĩ câu trả lời của bạn sẽ là những gì tôi tìm kiếm, nhưng nó không hoàn toàn hoạt động –

+0

Bạn cần phải nhập toán tử: 'import 'rxjs/add/operator/forkJoin';' hoặc nhập mọi thứ từ rxjs 'import 'rxjs/Rx';' –

Các vấn đề liên quan