function fnToDeferredObservable(fn) {
return Rx.Observable.defer(() => {
const result = fn();
let observable;
if (result instanceof Rx.Observable) {
observable = result;
} else if (result instanceof Promise) {
observable = Rx.Observable.fromPromise(result);
} else {
observable = Rx.Observable.return(result);
}
return observable;
});
}
function transactionEmmiter() {
const eventStream = RxReact.FuncSubject.create(() => () => action(...attr));
this.transactionStream = this.transactionStream.merge(eventStream);
}
function componentDidMount() {
this.transactionStream
.map(fnToDeferredObservable)
.concatAll()
.subscribe((result) => console.log(result),
(err) => console.log(err),
() => console.log('complete'));
}
<button className="btn btn-default" onClick={this.transactionEmmiter(this.props.increment, 1)}>
Increment
</button>
{' '}
<button className="btn btn-default" onClick={this.transactionEmmiter(this.props.double)}>
Double (Async)
</button>
<hr />
<button className="btn btn-default" onClick={this.transactionEmmiter(this.props.random)}>
Random Increment (Async)
</button>
eventStream适用于DomEvents,将它们合并到事务流中,事务流本身推迟任何给定的处理程序(并从返回值创建observable)concatAll,concats这些新的observable。结果是,任何异步函数都排队等待解析之前的事件。到目前为止工作,但是.concat在我最初发出一个DomEvent之后会以某种方式删除所有事件,它只是一段很短的时间(直到第一个Observable完成),其中发送的Dom事件由事务订阅处理。
Click Events
———2——>
—1————>
————3—>
Map Value to function expression
———y2——>
—y1————>
————y3—>
Merge
—y1—y2—y3—>
Map to deferred Observable
—y1—y2—y3—>
—x1—x2—x3—>
Concat all
—>xy1—>xy2—>xy2
expected output is:
result = y()
—>result1—>result2—>result3———>
example:
with input:
———2——>
—1————>
————3—>
——————————4—>
expected:
—>result1—>result2—>result3—>result4
actual:
—>result1—>result2—>result3