2017-08-08 8 views
1

2つのHTTPサービスと1つのソケットを呼び出す必要があります。最初のhttp呼び出しは、メタデータを取得し、その値の1つをローカルに設定することです。次に、後でソケット経由で更新される初期値を返す2番目のhttpサービスを呼び出す必要があります。RxJS5 - combineLatestがAngularのローカルプロパティにアクセスしていない

export class MyComponent implements OnInit { 
    subscription: Subscription; 
    title: string; 
    prop1: number; 
    prop2: number; 

    constructor(private http: HttpService, 
       private socket: SocketService, 
       private route: ActivatedRoute) { 
    } 

ngOnInit() { 
    this.prop1 = this.route.snapshot.parent.params['prop1']; 
    this.subscription = this.http.get('/metaData') 
     .do(data => { 
      this.title = data.title; 
      this.prop2 = data.prop2; 
     }) 
     //this.prop2 is undefined in combineLatest... 
     .combineLatest(
      this.http.get('initialData', { prop1: this.prop1, prop2: this.prop2 }), 
      this.socket.get('updateEvents', { prop1: this.prop1, prop2: this.prop2 }), 
      this.updateList) 
     .subscribe(data => { 
      this.data = data 
     }) 

}  

私は近くだと考えているが、prop2undefinedあるようcombineLatest、オペレータがローカルVARSにアクセスしていないことが表示されます:

これは私がこれまで持っているものです。これはside effectdoオペレータでprop2がcombineLatestの時刻に表示されないためですか?

注:combineLatestを使用した場合

.switchMap(data => this.http.get('initialData', { prop1: this.prop1, prop2: this.prop2 })) 

なぜPROP2 undefinedです:私はこのように、PROP2作品をswitchMapを使用した場合?

答えて

1

combineLatestが呼び出される前combineLatestに渡された引数が評価されているためです - doは、次の通知を受け取る前に、したがって、あなたが問題を解決するためにdeferを使用することができますなど、

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

// ... 

.combineLatest(
    Observable.defer(() => this.http.get('initialData', { prop1: this.prop1, prop2: this.prop2 })), 
    Observable.defer(() => this.socket.get('updateEvents', { prop1: this.prop1, prop2: this.prop2 })), 
    this.updateList 
) 

// ... 
関連する問題