2016-09-14 18 views
5

Nếu tôi gọi một chức năng trong ngOnInit() mà làm cho một cuộc gọi quan sát để có được dữ liệu, là this.getSomething() gọi trong ngOnInit vẫn async hoặc không ngOnInit chờ đợi cho đến khi this.getSomething() trả về một kết quả? Về cơ bản không "doSomethingElse" được thực thi trong ngOnInit() trước hoặc sau this.getSomething() kết thúc?Có đang gọi một hàm trên ngOnInit async không?

ngOnInit() { 
    this.getSomething(); 
    doSomethingElse; 
} 

getSomething() { 
    this.someService.getData() 
     .subscribe(
      result => { 
       this.result = result; 
      }, 
    error => this.errorMessage = <any>error); 
} 

Trả lời

9

ngOnInit() tự nó không chờ cuộc gọi không đồng bộ. Bạn có thể tự mã chuỗi theo cách nó chỉ thực hiện khi cuộc gọi async hoàn thành.

Ví dụ những gì bạn đặt bên trong subscribe(...) được thực thi khi dữ liệu đến.

Mã đi kèm sau subscribe(...) được thực hiện ngay lập tức (trước khi hoàn thành cuộc gọi không đồng bộ).

Có một số móc vòng đời của bộ định tuyến đợi các lời hứa hoặc các quan sát được trả về nhưng không có móc nối vòng đời thành phần hoặc chỉ thị nào thực hiện.

cập nhật

Để đảm bảo mã sau this.getSomething() được thực hiện khi getData() hoàn tất thay đổi mã để

ngOnInit() { 
    this.getSomething() 
    .subscribe(result => { 
     // code to execute after the response arrived comes here 
    }); 
} 

getSomething() { 
    return this.someService.getData() // add `return` 
     .map(// change to `map` 
      result => { 
       this.result = result; 
      }, 
    // error => this.errorMessage = <any>error); // doesn't work with `map` 
    // (could be added to `catch(...)` 
} 
+0

Cảm ơn Gunter. Nhưng nếu tôi có mã sau cuộc gọi this.getSomething() trong ngOnInit, mã đó có được thực hiện SAU mã trong getSomething() kết thúc không? – Felix

+0

Không, nó sẽ (có thể) được thực thi trước khi cuộc gọi 'http' trong' getSomething' kết thúc. – rinukkusu

+0

@Felix Tôi đã cập nhật câu trả lời của mình. Tôi hy vọng nó trở nên rõ ràng hơn. –

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