如何构建rxjs应用程序?大约有一百个玩具介绍示例,但不是一个完整应用程序的单个示例,其中包含小部件,子小部件等,显示整个应用程序中的数据流.
例如,假设你有一个具有某种状态的观察者.您需要将其传递给窗口小部件.该小部件具有需要该状态部分的子小部件.你做订阅吗?
sub = state.subscribe(widget)
Run Code Online (Sandbox Code Playgroud)
现在'小部件'在monad之外.子窗口小部件不能在状态上使用可观察的方法.如果将窗口小部件作为副作用运行,则会出现同样的问题.
state.doAction(widget)
Run Code Online (Sandbox Code Playgroud)
那么你将流传递给小部件吗?如果是这样,你会得到什么回报?
what = widget(state)
Run Code Online (Sandbox Code Playgroud)
小部件是否订阅状态并返回一次性用户?它是否返回从状态派生的流?如果是这样,它里面有什么?你尝试从所有的部件/ subwidgets /子subwidgets具有广泛用途的SelectMany(身份)来获得你为了揭开整个事情关闭订阅最终应用程序流收集所有的流在一起吗?
如果窗口小部件根据状态按需创建子窗口小部件,窗口小部件如何管理其子窗口小部件?我一直在尝试使用groupBy()的解决方案,每个子窗口小部件都有一个组,但是从嵌套的observable管理所有订阅或流是一个令人难以置信的噩梦.
即使是整个应用程序的一个示例也会有所帮助.
与其他"FRP"库不同,Rx不会阻止毛刺:使用时间不匹配的数据调用回调.有办法解决这个问题吗?
作为一个例子,假设我们有一系列昂贵的计算从单个流派生(例如,而不是_.identity,下面,我们做一个排序,或ajax提取).我们做了明确的改变,以避免重新计算昂贵的东西.
sub = new Rx.Subject();
a = sub.distinctUntilChanged().share();
b = a.select(_.identity).distinctUntilChanged().share();
c = b.select(_.identity).distinctUntilChanged();
d = Rx.Observable.combineLatest(a, b, c, function () { return _.toArray(arguments); });
d.subscribe(console.log.bind(console));
sub.onNext('a');
sub.onNext('b');
Run Code Online (Sandbox Code Playgroud)
第二个事件最终将导致一些错误的状态:我们得到三个事件,而不是一个,这浪费了一堆cpu并要求我们明确解决不匹配的数据.
这个特定的例子可以通过删除distinctUntilChanged来解决,如果输入没有改变,可以编写一些不稳定的scan()函数来传递前一个结果.然后你可以压缩结果,而不是使用combineLatest.它很笨拙但可行.
但是,如果在任何地方存在异步,例如ajax调用,则zip不起作用:ajax调用将同步(如果已缓存)或异步完成,因此您无法使用zip.
编辑
尝试使用更简单的示例来阐明所需的行为:
你有两个流,a和b.b取决于a.b是异步的,但是浏览器可以缓存它,因此它可以独立地更新,也可以同时更新.因此,浏览器中的特定事件可能会导致以下三种情况之一:更新; b更新; a和b都更新.期望的行为是在所有三种情况下仅调用一次回调(例如渲染方法).
zip不起作用,因为当a或b单独触发时,我们不会收到来自zip的回调.combineLatest不起作用,因为当a和b一起发射时,我们得到两个回调.
我正在为 OSX 签署 install4j 安装程序,但是 OSX 拒绝了它。系统日志只报告被拒绝,spctl只报告被拒绝,不做任何解释。我如何确定它被拒绝的原因?