所以我有一个observable,它发一个HTTP帖子来从服务器获取访问令牌。我有另一个执行到同一服务器的get,但要求第一个访问令牌存在。所以我希望能够在两个不同的地方同时订阅这两个observable,但GET observable当然必须等待POST observable。如何在另一个Observables订阅完成时进行观察等待?
答案 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请求。
请注意,使用箭头功能时,此代码可能会更清晰,但我正在努力保持与某些旧版浏览器的兼容性。