检查rxjs observable是否完整

时间:2016-06-12 11:05:04

标签: rxjs rxjs5

我有一个类,当实例化时会进行一些Web服务调用,下面是伪代码:

# values = one of my three arrays
f, (ax1, ax2, ax3) = plt.subplots(3, sharex=True)
bins1 = np.histogram([i for i in values if 0.05<i<0.25], bins = 50)[1] # this is if I want to limit the array values to a certain range - but see above
ax1.hist(values, bins1, facecolor='blue', alpha=0.5)
num_1, bins_1  = np.histogram([i for i in values if 0.05<i<0.25], bins1)
bins_01 = [0.5 * (bins_1[i] + bins_1[i+1]) for i in range(len(bins_1)-1)]
popt, pcov = curve_fit(gaussian, bins_01, num_1) # "gaussian" is an already defined function
x_fit = py.linspace(bins_01[0], bins_01[-1], 100)
y_fit = gaussian(x_fit, *popt)
ax1.plot(x_fit, y_fit, 'r--', linewidth=2)

同一个班级正在侦听onclick事件。

触发此偶数时,如果原始Web服务调用已完成:执行某些操作

如果他们完成,请在做某事之前等待他们完成。

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

2 个答案:

答案 0 :(得分:0)

我将其称为异步门。 这些实际上很容易用Rx做。 您将需要缓存Web服务调用可观察序列。 然后在其他基于这些完成的调用中,您只需flatMap关闭其结果。 由于这些来自Promises,我相信结果会留给后期订阅者,但如果没有,那么你只需要replay(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分钟 - https://youtu.be/Tp5mRlHwZ7M?t=51m30s

您可能还想考虑switch运营商,因为您不希望重叠事件

答案 1 :(得分:0)

我相信withLatestFromcombineLatest会做你所要求的。

根据您是否希望仅使用服务提供的数据单击按钮一次,您可以使用withLatestFrom。如果您希望使用服务先前提供的数据继续点击该按钮,您可以使用combineLatest

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'));

jsbin example