在一个角度项目中,我有一个需要异步加载库的服务 . 为了确保使用此库的方法在加载之前不调用它,我创建了一个isLoaded ReplaySubject,它在库加载之前不会发出 . 要最初测试设置,方法看起来类似于:
myMethod = (a: string): Observable<IPromise<Building[]>> => { //IPromise<any[]> |
return this.isLoaded.asObservable().map(() => {
//do stuff to setup query parameters etc.
//QT.execute returns a Promise, or rather, an object which can be cast to a promise
return QT.execute(buildingsQuery).then(result => result);
});
};
然后,要使用结果,我必须这样做
myMethod.subscribe(res => {res.then(...)});
丑陋 .
我的下一步是返回一个observable,所以我将承诺包装在Observable.fromPromise()中,但后来我不知道如何订阅这个新的内部observable . 我试过这个:
myMethod = (a: string): Observable<Building[]> => {
let bldgObs: Observable<Building[]>;
return this.isLoaded.asObservable().map(() => {
//do stuff to setup query parameters etc.
bldgObs = Observable.fromPromise(QT.execute(buildingsQuery).then(result => {
return result;
}) as any); //have to cast as any b/c return value's .then method is not always compatible with regular promises. This has worked fine elsewhere.
})
.combineLatest(bldgObs, (data1, data2) => {
return data2;
});
};
但我从来没有得到过 Value . 我的理解是combineLatest将使用调用observable(在本例中为this.isLoaded.asObservable())作为要观察的observable列表中的第一项 .