我有一个类,当实例化时会进行一些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语句。
答案 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)
我相信withLatestFrom
或combineLatest
会做你所要求的。
根据您是否希望仅使用服务提供的数据单击按钮一次,您可以使用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'));