Javascript RxJS可观察的,等待可观察的
所以我有一个observable,它通过HTTP post从服务器获取访问令牌。我有另一个执行同一服务器的get,但需要第一个服务器的访问令牌。所以我希望能够在两个不同的地方同时订阅这两个可观测数据,但是GET observable当然必须等待POST observable。我如何让一个可观察对象等待另一个可观察对象订阅完成?我不确定我是否理解正确,但下面是一个选项。假设Javascript RxJS可观察的,等待可观察的,javascript,angular,rxjs,reactive-extensions-js,Javascript,Angular,Rxjs,Reactive Extensions Js,所以我有一个observable,它通过HTTP post从服务器获取访问令牌。我有另一个执行同一服务器的get,但需要第一个服务器的访问令牌。所以我希望能够在两个不同的地方同时订阅这两个可观测数据,但是GET observable当然必须等待POST observable。我如何让一个可观察对象等待另一个可观察对象订阅完成?我不确定我是否理解正确,但下面是一个选项。假设postHttp$是可观察的访问令牌获取,而getFromServer$是执行服务器获取的令牌获取,并且假设这些是只有一个值的
postHttp$
是可观察的访问令牌获取,而getFromServer$
是执行服务器获取的令牌获取,并且假设这些是只有一个值的序列(即类似于承诺):
将等待postHttp有一个值来生成一个承诺,该承诺将被展平为其解析值。i、 e.postHttp$.flatMap(函数(authToken){return$.ajax(…)})
要检索该值,您可以订阅该observable,或者继续将其他操作符链接到它。GET observable(…)等待POST observable。
接受承诺作为其选择器功能参数的返回值,因此无需在此转换为flatMap
Rx.Observable
这就是你想要的吗?我想出了一个解决方案,所以我想我应该继续发表我自己的答案。如果有人知道一种更有效的做事方式,一定要给出答案,我会接受
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调用。这是很有用的,因为它可以让我的页面立即订阅他们想要的任何可以观察到的内容,而不必担心首先订阅postObservable,然后在准备好后再订阅下一个observable的回调地狱。对于单个页面,post请求完全隐藏,他们只订阅get请求
请注意,这段代码使用箭头函数可能会更简洁,但我正在尝试与一些较旧的浏览器兼容。重要的是,它适合您。但是:1。如果你必须把一系列的可观测数据链接到比这个更长的时间,那么它就不会是地狱,但无论如何它都会是地狱,2。这些机制(操作顺序)已经在Rx运营商中实现,最好的方法是重用和组合现有代码,这是经过广泛测试的。3.一般来说,最好是功能性编程,即尽可能使用纯函数(无副作用),这将简化您的推理和测试(我在这里了解到,
postObservable
以某种方式修改authToken
),您实际上只是在做this.postObservable.flatMap(function(authToken)){return$.ajax(…)})
。然后你可以订阅它来处理ajax调用中的数据。我将更新我的答案以反映新信息。我建议你阅读此文章以进一步了解Rxjs:@user3743222有趣。你认为你可以更新答案以反映此评论吗?如果你可以将其放在我添加的变量中我很高兴接受你的回答。