基于其他可观察的更新来自promise的observable

时间:2017-11-14 10:10:45

标签: angular rxjs

我有一个服务从我们的后端返回过滤器。此服务有一个返回promise的方法getForPage和一个返回一个observable的getForPage$

在服务上还有方法onEvent,它是一个可观察的,当过滤器发生变化时会发出。

现在我希望在getForPage$发出事件时更新onEvent observable。使用以下代码完成了这项工作。

getForPage(page: string): Promise<DashboardPageFilter[]> {
    return this.service.call(
        'dashboard.page.filter.getForPage',
        {page}
    );
}

getForPage$(page: string): Observable<DashboardPageFilter[]> {
    let subject = new Subject<DashboardPageFilter[]>();

    this.getForPage(page).then(
        response => subject.next(response),
        response => subject.error(response)
    );

    this.onEvent().subscribe(() => {
        console.log(page);
        this.getForPage(page).then(
            response => subject.next(response),
            response => subject.error(response)
        );
    });

    return subject.asObservable();
}

但是,当我可以在onEvent上完成订阅时,我将无法关闭。因此,即使没有关于主题可观察的活动订阅,也会调用日志。

如何根据可以更新并在路线更改时完成的承诺进行观察?

2 个答案:

答案 0 :(得分:0)

您可以改为使用merge运算符:

getForPage$(page: string): Observable<DashboardPageFilter[]> {

    const obsFromPromise = Observable.fromPromise(this.getForPage(page));

    const result = this.onEvent.switchMap(() => Observable.fromPromise(this.getForPage(page)));

    return Observable.merge(obsFromPromise, obsFromEvent)
}

通过这样做,您的承诺和您的事件将合并到一个没有订阅的observable中。

有关合并运算符的更多详细信息,请参见rxjs documentation website

答案 1 :(得分:0)

在更多尝试解决问题后,评论中的一些想法和对代码的重新审视我找到了解决问题的方法。然而,这还有另一个小问题

在代码生活在observable之外进行更新之前。使用下面的代码更新实时内部观察者。

return Observable.create((observer: Observer<DashboardPageFilter[]>) => {
    this.getForPage(page).then(
        response => observer.next(response),
        response => observer.error(response)
    );

    let sub = this.onEvent().subscribe(() => {
        console.log(page);
        this.getForPage(page).then(
            response => observer.next(response),
            response => observer.error(response)
        );
    });

    return function () {
        sub.unsubscribe();
    };
});

主要是回调,它取消订阅取消订阅。

然而,在角度调整中,您需要在调用取消订阅之前将路线更改为其他路线(因此不同的参数不同)。