2016-02-23 24 views
21

Tôi đang cố gắng cải thiện kiến ​​thức của mình về Angular2 bằng cách di chuyển một ứng dụng hiện được viết bằng Angular1Angular2 Quan sát - làm thế nào để chờ cho tất cả các cuộc gọi hàm trong một vòng lặp kết thúc trước khi tiếp tục?

Một tính năng đặc biệt khiến tôi bối rối. Tôi đang cố gắng để tái tạo một tính năng mà một chức năng gọi chờ đợi để tiến hành cho đến khi chức năng nó được gọi đã hoàn thành một vòng lặp của lời hứa. Trong một góc chức năng tôi kêu gọi ngoại hình cơ bản như thế này:

this.processStuff = function(inputarray, parentnodeid) { 
    var promises = []; 
    var _self = this; 
    angular.forEach(inputarray , function(nodeid) { 

     switch (parentnodeid) 
     { 
      case ‘AAA’ : var component = _self.doMoreStuff(nodeid, parentnodeid); break; 
      case ‘BBB’ : var component = _self.doMoreStuff(nodeid, parentnodeid); break; 
      case ‘CCC’ : var component = _self.doMoreStuff(nodeid, parentnodeid); break; 
      default : var component = null; 
     } 
     promises.push(component); 
    }); 
    return $q.all(promises); 
}; 

Nó chứa một vòng lặp foreach gọi một function (doMoreStuff) mà cũng trả về một lời hứa và nó lưu trữ tất cả những lời hứa trả lại trong một mảng.

Với Angular1, khi tôi gọi processStuff trong một hàm khác, tôi có thể đếm trên hệ thống đợi cho đến khi processStuff hoàn tất trước khi nhập vào mã trong khối sau đó. IE:

service.processStuff(arraying, parentidarg) 
     .then(function(data) { 
       ... 

Người gọi của processStuff chờ đợi cho tất cả doMoreStuff lời gọi để hoàn thành cho đến khi người gọi của processStuff đi vào sau đó khối của nó.

Tôi không chắc chắn về cách đạt được điều này với Angular2 và Observables. Tôi có thể nhìn thấy từ những bài viết đó để bắt chước những lời hứa, quan sát về cơ bản chỉ cần sử dụng đăng ký thay vì sau đó:

Angular 1.x $q to Angular 2.0 beta

Nhưng làm thế nào để tôi chờ đợi cho tất cả các lời gọi trong forEach vòng lặp để hoàn thành trước khi hệ thống của tôi có thể tiến hành?

Trả lời

50

Tôi đã làm điều này với forkJoin

import {Observable} from 'rxjs/Observable'; 
import 'rxjs/add/observable/forkJoin'; 

Observable.forkJoin(
    this.http.get('./friends.json').map((res: Response) => res.json()), 
    this.http.get('./customer.json').map((res: Response) => res.json()) 
) 
.subscribe(res => this.combined = {friends: res[0].friends, customer: res[1]}); 

Một số thông tin thêm ở đây: http://www.syntaxsuccess.com/viewarticle/angular-2.0-and-http

+1

lập luận cho forkJoin có thể là một mảng? Bạn có thể vui lòng hiển thị một ví dụ mà bạn đang lặp lại với vòng lặp for để điền vào "mảng" này không. Tôi không chắc chắn nếu vòng lặp là bên trong hoặc bên ngoài khối Observable mới và cách sử dụng observer.next(); và observer.complete(); –

+0

xem tại đây để được hướng dẫn nhập cụ thể: http://stackoverflow.com/questions/34581471/angular2-http-is-missing-map-function/34581771#34581771 –

+1

Có, nó có thể là một mảng: https: // github. com/Tiện ích mở rộng phản ứng/RxJS/blob/master/doc/api/core/toán tử/forkjoin.md – msanford

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