我对反应式编程很陌生,但已经恋爱了。但是,仍然很难将我的大脑切换到它。我正在尝试遵循所有建议,如“避免使用主题”和“避免不纯函数”,当然还有“避免命令式代码”。
我发现很难实现的是简单的跨模块通信,其中一个模块可以注册“动作”/可观察的,另一个可以订阅并对其做出反应。一个简单的消息总线可能会起作用,但这将强制使用我试图避免的主题和命令式代码样式。
所以这是我正在玩的一个简单的起点:
// some sandbox
class Api {
constructor() {
this.actions = {};
}
registerAction(actionName, action) {
// I guess this part will have to be changed
this.actions[actionName] = action.publishReplay(10).refCount();
//this.actions[actionName].connect();
}
getAction(actionName) {
return this.actions[actionName];
}
}
const api = new Api();
// -------------------------------------------------------------------
// module 1
let myAction = Rx.Observable.create((obs) => {
console.log("EXECUTING");
obs.next("42 " + Date.now());
obs.complete();
});
api.registerAction("myAction", myAction);
let myTrigger = Rx.Observable.interval(1000).take(2);
let executedAction = myTrigger
.flatMap(x => api.getAction("myAction"))
.subscribe(
(x) => { console.log(`executed action: ${x}`); },
(e) => {},
() => { console.log("completed");});
// -------------------------------------------------------------------
// module 2
api.getAction("myAction")
.subscribe(
(x) => { console.log(`SECOND executed action: ${x}`); },
(e) => {},
() => { console.log("SECOND completed");});
所以目前第二个模块订阅它“触发”“myAction”Observable。在现实生活中,这可能是一个 ajax 调用。有没有办法让所有订阅者延迟/等待,直到从 module1 正确调用“myAction”?再一次 - 使用主题很容易做到这一点,但我正在尝试按照推荐的做法来做。