Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript RxJS可观察的,等待可观察的_Javascript_Angular_Rxjs_Reactive Extensions Js - Fatal编程技术网

Javascript RxJS可观察的,等待可观察的

Javascript RxJS可观察的,等待可观察的,javascript,angular,rxjs,reactive-extensions-js,Javascript,Angular,Rxjs,Reactive Extensions Js,所以我有一个observable,它通过HTTP post从服务器获取访问令牌。我有另一个执行同一服务器的get,但需要第一个服务器的访问令牌。所以我希望能够在两个不同的地方同时订阅这两个可观测数据,但是GET observable当然必须等待POST observable。我如何让一个可观察对象等待另一个可观察对象订阅完成?我不确定我是否理解正确,但下面是一个选项。假设postHttp$是可观察的访问令牌获取,而getFromServer$是执行服务器获取的令牌获取,并且假设这些是只有一个值的

所以我有一个observable,它通过HTTP post从服务器获取访问令牌。我有另一个执行同一服务器的get,但需要第一个服务器的访问令牌。所以我希望能够在两个不同的地方同时订阅这两个可观测数据,但是GET observable当然必须等待POST observable。我如何让一个可观察对象等待另一个可观察对象订阅完成?

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

  • postHttp$.flatMap(函数(authToken){return$.ajax(…)})
    将等待postHttp有一个值来生成一个承诺,该承诺将被展平为其解析值。i、 e.
    GET observable(…)等待POST observable。
    要检索该值,您可以订阅该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有趣。你认为你可以更新答案以反映此评论吗?如果你可以将其放在我添加的变量中我很高兴接受你的回答。