0

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

4

2 回答 2

0

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

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

那是你想要的吗?

于 2016-01-06T11:00:22.760 回答
-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 请求。

请注意,使用箭头函数,这段代码可能会更简洁,但我正在尝试与一些旧浏览器保持兼容。

于 2016-01-06T18:40:07.603 回答