检查rxjs observable是否完整

检查rxjs observable是否完整,rxjs,rxjs5,Rxjs,Rxjs5,我有一个类,在实例化时会进行一些web服务调用,伪代码如下: Rx.Observable.fromPromise(jQuery.getJSON('https://api.github.com/users')) .flatMap(function () { return Rx.Observable.fromPromise(jQuery.getJSON('https://api.github.com/users')); }); 同一个类正在侦听onclick事件 即使触发了此操作,如

我有一个类,在实例化时会进行一些web服务调用,伪代码如下:

Rx.Observable.fromPromise(jQuery.getJSON('https://api.github.com/users'))
 .flatMap(function () {
   return Rx.Observable.fromPromise(jQuery.getJSON('https://api.github.com/users'));  
 });
同一个类正在侦听onclick事件

即使触发了此操作,如果原始web服务调用已完成,请执行以下操作:

如果它们没有完成,等待它们完成,然后再做某事


我想知道如何用rxjs方法实现这一点?而不是设置变量和使用if语句。

我将其称为异步门。 用Rx做这些其实很容易。 您将需要缓存web服务调用的可观察序列。 然后,在其他基于这些已完成的调用中,您只需
flatMap
关闭它们的结果。 由于这些都是从承诺中获得的,我相信结果会保留给迟到的订阅者,但如果没有,那么您只需要
重播(1)
序列

所以在psudeo代码中

var startUpData = Rx.Observable.fromPromise(jQuery.getJSON('https://api.github.com/users'))
 .flatMap(function () {
   return Rx.Observable.fromPromise(jQuery.getJSON('https://api.github.com/users'));  
 });

var events = Rx.Observable....//Your event wired up here.

//When an event
events
    .flatMap(function(evt){ 
        //Wait until the startUpData yeilds, but pass on the evt data instead.
        return startUpData.map(function(){ return evt;})
//do something here knowing that your event has fired, but the web services have also completed.
    .subscribe();
你可以看到马特·巴雷特(Matt Barrett)在本视频51分钟后解释了一个异步门-


您可能还想考虑<代码>开关>代码>运算符,如果您不希望发生重叠事件

,我会把它称为异步门。 用Rx做这些其实很容易。 您将需要缓存web服务调用的可观察序列。 然后,在其他基于这些已完成的调用中,您只需
flatMap
关闭它们的结果。 由于这些都是从承诺中获得的,我相信结果会保留给迟到的订阅者,但如果没有,那么您只需要
重播(1)
序列

所以在psudeo代码中

var startUpData = Rx.Observable.fromPromise(jQuery.getJSON('https://api.github.com/users'))
 .flatMap(function () {
   return Rx.Observable.fromPromise(jQuery.getJSON('https://api.github.com/users'));  
 });

var events = Rx.Observable....//Your event wired up here.

//When an event
events
    .flatMap(function(evt){ 
        //Wait until the startUpData yeilds, but pass on the evt data instead.
        return startUpData.map(function(){ return evt;})
//do something here knowing that your event has fired, but the web services have also completed.
    .subscribe();
你可以看到马特·巴雷特(Matt Barrett)在本视频51分钟后解释了一个异步门-


您可能还想考虑<代码>开关>代码>运算符,如果您不希望发生重叠事件

,我相信<>代码>从或 > CuleLeTestEng/<代码>将按照您的要求执行。 根据您是否只允许使用服务提供的数据单击按钮一次,您可以使用
with latestfrom
。如果您希望使用服务先前提供的数据继续单击按钮,您可以使用
combinelateest

const futureEvent$ = Rx.Observable.timer(3000);
const btnClick$ = Rx.Observable
  .fromEvent(document.querySelector('button'), 'click');
const futureAndBtnClick$ = futureEvent$.combineLatest(btnClick$);

futureAndBtnClick$.subscribe(x => console.log('click + future stuff happened'));

我相信
与latest from
组合测试将满足您的要求

根据您是否只允许使用服务提供的数据单击按钮一次,您可以使用
with latestfrom
。如果您希望使用服务先前提供的数据继续单击按钮,您可以使用
combinelateest

const futureEvent$ = Rx.Observable.timer(3000);
const btnClick$ = Rx.Observable
  .fromEvent(document.querySelector('button'), 'click');
const futureAndBtnClick$ = futureEvent$.combineLatest(btnClick$);

futureAndBtnClick$.subscribe(x => console.log('click + future stuff happened'));

您能否指定一个预期行为的大理石图?这里有大理石图的例子;rxmarbles.com。这基本上是在一个时间轴上显示输入和预期输出。你能指定一个预期行为的大理石图吗?这里有大理石图的例子;rxmarbles.com。这基本上是在一个时间轴上呈现输入和预期输出。