【问题标题】:Get observable, but wait for promise before activating获得可观察性,但在激活之前等待承诺
【发布时间】:2016-04-14 10:21:12
【问题描述】:

在使用 RxJS 在 Angular 2 中激活 observable 之前,我需要等待 promise 完成。

更具体地说,我需要使用返回承诺的第三方库设置状态,并在发出 GET 请求之前将一些结果信息插入到我的 HTTP 标头中:

export class LiveDataService {

    private headersPromise;

    constructor(public http: Http) {
        this.headersPromise = $.connection('/init').then((state) => setupHeaders(state));
    }

    activate(route: string) {
        return this.http.get('api/v1/' + route, { headers })
            .Merge(anotherStateBasedObservable);
    }

)

除了,虽然我需要如图所示立即返回 observable,但在调用 http.get 之前,我还必须等待 promise 完成。

我可以想到一些需要 3-4 个翻译阶段的方法,但我觉得应该有一个相当直接的方法来做到这一点。

【问题讨论】:

    标签: promise angular observable rxjs


    【解决方案1】:

    你真的需要一个 observable 来返回吗?我会这样做:

    // getState caches the state promise, so '/init' gets requested only once
    // but is lazy loaded
    var _statePromise = null;
    function getState() {
      return _statePromise || (_statePromise = $.connection('/init'));
    }
    
    function routeChange(route) {
      return getState()
        .then(state => setupHeaders(state))
        .then(headers => this.http.get('api/v1/' + route, { headers }));
    }
    

    编辑

    您可以使用 flatMapflatMapLatest 使用异步函数映射 observable:

    // routeSource is an RxJS Observable
    var contentSource = routeSource.flatMapLatest(routeChange);
    

    编辑

    您可以将 Promise 转换为 observables,反之亦然:Bridging Promises

    这可能是你需要的:

    // getState caches the state promise, so '/init' gets requested
    // only once, but is lazy loaded
    var _statePromise = null;
    function getState() {
      return _statePromise || (_statePromise = $.connection('/init'));
    }
    function Method(route) {
      return Rx.Observable.fromPromise(this.getState())
        .flatMap(state => setupHeaders(state)) // flatMap handles promises
        .flatMap(headers => this.http.get('api/v1/' + route, { headers }))
        .merge(anotherStateBasedObservable);
    }
    

    【讨论】:

    • 是的,我确实需要一个 observable。否则,我对 observable 有一个承诺,我必须在每个调用者中打开两次。更重要的是(我知道我没有提到),有状态信息的目的是链接其他可观察的信息。最后,由于 observables 似乎是 angular 2 中的规范,我认为我不想开始将 observables 包装在 Promise 中。
    • @shannon 你当然不应该将 observables 包装在 Promise 中,因为 Promise 本身就像轻量级的单值 observables。我编辑了我的代码,使其映射到一个 Observable(大多数 RxJS Observable 组合函数也接受承诺)
    • 能否请您澄清一下您建议我如何申请flatMap
    • @shannon http.get 返回什么?它返回一个承诺还是一个可观察的?
    • 我同意getState 的建议。在我的代码中,我实际上使用了单例/初始化,我在上面已经阐明了这一点。我没有在您的代码中看到您在上一条评论中提到的返回 observable 的位置。
    猜你喜欢
    • 1970-01-01
    • 2019-03-31
    • 1970-01-01
    • 2020-04-22
    • 1970-01-01
    • 2017-07-31
    • 2023-02-17
    • 2019-07-27
    • 1970-01-01
    相关资源
    最近更新 更多