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