RxJS5 - combineLatest不访问Angular的本地属性

时间:2017-08-08 23:17:59

标签: angular rxjs5

我需要调用两个http服务和一个套接字。第一个http调用是获取元数据并在本地设置其值之一。然后,我需要调用第二个http服务,该服务返回初始值,然后通过套接字更新。

这是我到目前为止所做的:

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
        })

}       

我相信我很接近,但似乎combineLatest运营商未访问本地变量,prop2undefined。这是因为我在side effect运算符中执行了do,而combineLatest按时没有看到prop2吗?

注意:如果我使用switchMap,prop2可以使用,如下所示:

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

使用undefined时,为什么prop2 combineLatest

1 个答案:

答案 0 :(得分: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
)

// ...