RxJS Observable等待Observable

时间:2016-01-06 07:40:00

标签: javascript angular rxjs reactive-extensions-js

所以我有一个observable,它发一个HTTP帖子来从服务器获取访问令牌。我有另一个执行到同一服务器的get,但要求第一个访问令牌存在。所以我希望能够在两个不同的地方同时订阅这两个observable,但GET observable当然必须等待POST observable。如何在另一个Observables订阅完成时进行观察等待?

2 个答案:

答案 0 :(得分:0)

不确定我理解得对,但是这里有一个选项。假设postHttp$是您的访问令牌提取可观察的,getFromServer$是执行获取到服务器的那个,并假设这些只是一个值的序列(即类似承诺):

  • postHttp$.flatMap(function (authToken){return $.ajax(...)})将等待postHttp有一个值来生成一个承诺,该承诺将被平铺到其解析值。 ie the GET observable (...) wait on the POST observable.要检索该值,您可以订阅observable,或继续将其他运算符链接到它。
    • flatMap接受promises作为其选择器函数参数的返回值,因此此处无需转换为Rx.Observable

这就是你想要的吗?

答案 1 :(得分:-1)

我想出了一个解决方案,所以我想我会继续发表自己的答案。如果有人知道更有效的做事方式肯定会发布答案,我会接受它!

this.getObservable = Rx.Observable.create(function(observer){
  this.postObservable.subscribe(null, null, function onComplete(){
    var ajaxObservable = Rx.Observable.fromPromise($.ajax({
      url: this.apiPath,
      method: 'GET',
      beforeSend: function (xhr) {
        // this.authToken is created by the postObservable, so we have to subscribe to the oncomplete of that in order to use it.  
        xhr.setRequestHeader('Authorization', this.authToken); 
      }.bind(this)
    }).promise());
    ajaxObservable.subscribe(
      function onNext(data){
        observer.next(data);
      }, 
      function onError(error){
        observer.error(error);
      }, 
      function onComplete(){
        observer.complete();
      }
    );
  }.bind(this));
}.bind(this));

在这段代码中,getObservable订阅了postObservable,只有完成后才能进行自己的Ajax调用。这很有用,因为它可以让我的页面立即订阅他们想要的任何GET observable,而不必担心首先订阅postObservable的回调地狱,然后在准备就绪时将其附加到下一个observable。对于单个页面,post请求是完全隐藏的,他们只是订阅了get请求。

请注意,使用箭头功能时,此代码可能会更清晰,但我正在努力保持与某些旧版浏览器的兼容性。