1

在一个角度项目中,我有一个需要异步加载库的服务。为了确保使用这个库的方法在加载之前不要调用它,我创建了一个 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,所以我将 promise 包装在 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;
        });
};

但我从来没有得到价值。我的理解是 combineLatest 将使用调用 observable(在本例中为 this.isLoaded.asObservable())作为要观察的 observables 列表中的第一项。

4

0 回答 0