2016-11-04 21 views
5

Trong ứng dụng Angular2-typescript của tôi, tôi đang sử dụng forkJoin để trả về một Observable chỉ khi tất cả các cuộc gọi HTTP song song được thực hiện.Làm thế nào để hủy đăng ký khỏi một Observable được trả về bởi forkJoin?

Issue: gọi lại thuê bao tiếp tục được thực hiện vô thời hạn

Đây là mã của tôi:

http.service

import {Http} from "@angular/http"; 

constructor (private _http: HTTP) {} 

makeGetRequest(....) { 
    return this._http.get(URL) 
      .map (res => res.json) 
      .toPromise(); 

my.service

import {Observable} from "rxjs/Observable"; 
import {HttpService} from "http.service" 

constructor (private _httpService: HttpService) {} 

myMethod(): Observable<any[]> { 
return Observable.forkJoin(
      this._httpService.makeGetRequest(
       URL1 
      ), 
      this._httpService.makeGetRequest(
       URL2 
      ) 
     ) 
} 

my.component

import MyService from "my.service"; 
import Subscription from "rxjs"; 

constructor (private _service: MyService) {} 

mySub: Subscription; 

ngOnInit() { 
    this.mySub = this._service.myMethod.subscribe(data => { 
     data.forEach(console.log(data)); 
     this.mySub.unsubscribe(); 
    } 
} 

gì tôi đã cố gắng (cùng một vấn đề):

  • trở lại một quan sát ở Http.service chứ không phải là một lời hứa
  • sử dụng my.component .first() .subscribe() thay vì chỉ đăng ký()
  • đặt this.mySub.unsubscribe(); ở phần cuối của ngOnInit chứ không phải bên trong đăng ký callback (cũng với setTimeout (() => ....))
+1

Ý của bạn là gì với 'cuộc gọi đăng ký tiếp tục được thực thi vô thời hạn'? – Picci

+2

Câu hỏi không có ý nghĩa. forkJoin tham gia các kết quả từ các quan sát * đã hoàn thành * và không nên hủy đăng ký vì nó có một giá trị duy nhất. Nếu bạn gặp khó khăn với * đang được thực thi vô thời hạn *, vui lòng cung cấp [MCVE] (http://stackoverflow.com/help/mcve) có thể sao chép sự cố của bạn – estus

+0

@ tốt nhất bạn nói đúng. dường như điều này đã xảy ra vì có đăng ký được khởi tạo hai lần và điều đó gây ra vấn đề. Hãy trả lời câu hỏi, tôi sẽ chấp nhận nó;) – dragonmnl

Trả lời

9

Như forkJoin reference nói, nó

Chạy tất cả các chuỗi quan sát song song và thu thập các yếu tố cuối cùng của họ.

Điều này có nghĩa là toán tử nhận giá trị từ các quan sát đã hoàn thành và trả về một giá trị được hoàn thành có thể quan sát được với một giá trị duy nhất. Không cần phải hủy đăng ký khỏi nó.

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