在JavaScript中,经常使用观察者模式.它有一个棘手的问题,那就是主体对观察者的参考.他们需要清理.对于常规应用程序,我使用以下经验法则:
subject.on('event', ...)observer.listenTo(subject, 'event', ...)在第二种情况下,listenTo它意识到观察者的生命周期,并且当观察者死亡时它将自动移除听众.
在现代SPA(单页应用程序)样式中,只有部分应用程序在任何时候都处于活动状态,这一点变得非常重要.如果将它与Web套接字结合起来,这是一个完美的事件流候选者,并且很可能长寿,这就变得更加重要.
使用FRP,类似于表示随时间变化的值的事件流,我(不知道)创建了大量的监听器.每个filter,map并flatMap创建一个绑定(可能使用一个监听器)到前一个流的新流.
在我看来,确定如何以及何时需要删除这些侦听器似乎相当棘手.我无法想象我是第一个考虑这个问题的人,但我在互联网上找不到这个.
我看到其他语言中的一些框架使用弱引用.JavaScript没有弱引用的概念(WeakMap在这里不可用).即使它有,但它似乎是一个坏主意,因为它不清楚垃圾收集何时发生.
我从各种演讲者那里听说,$ watch对于你的应用程序的性能是多么危险.我想知道是否有人在AngularJS应用程序中比较了Rxjs的Observable与$ watch的性能.我知道Observables将成为Angular 2的一部分.
RxJava v1.0.13引入了一种新的Observable:rx.Single.它非常适合请求 - 响应模型,但缺少引入doOnNext()等运算符的标准副作用.因此,结果会发生很多事情要困难得多.
我的想法是用同一个Single实例的多个订阅替换doOnNext().但这可能导致底层工作多次完成:每次订阅一次.
示例rx.Single实现:
private class WorkerSubscribe<SomeData>() : Single.OnSubscribe<SomeData> {
override fun call(sub: SingleSubscriber<in SomeData>) {
try {
val result = fetchSomeData()
sub.onSuccess(result)
} catch(t: Throwable) {
sub.onError(t)
}
}
}
val single = Single.create<SomeData>(WorkerSubscribe())
Run Code Online (Sandbox Code Playgroud)
用法:
single.subscribe({}, {})
single.subscribe({}, {}) // Data is fetched for the second time
Run Code Online (Sandbox Code Playgroud)
是否有可能创建一个单独的实例,即使多次调用single.subscribe(),也不会多次fetchSomeData(),但缓存并返回相同的结果?
我有对象流,我需要比较当前对象是否与以前相同,在这种情况下发出新值.我发现distinctUntilChanged操作符应该完全符合我的要求,但由于某种原因,除了第一个之外它永远不会发出值.如果我删除distinctUntilChanged值正常发出.
我的代码:
export class SettingsPage {
static get parameters() {
return [[NavController], [UserProvider]];
}
constructor(nav, user) {
this.nav = nav;
this._user = user;
this.typeChangeStream = new Subject();
this.notifications = {};
}
ngOnInit() {
this.typeChangeStream
.map(x => {console.log('value on way to distinct', x); return x;})
.distinctUntilChanged(x => JSON.stringify(x))
.subscribe(settings => {
console.log('typeChangeStream', settings);
this._user.setNotificationSettings(settings);
});
}
toggleType() {
this.typeChangeStream.next({
"sound": true,
"vibrate": false,
"badge": false,
"types": {
"newDeals": true,
"nearDeals": true,
"tematicDeals": false,
"infoWarnings": false,
"expireDeals": true
}
});
}
emitDifferent() …Run Code Online (Sandbox Code Playgroud) 在Java 9中,Flow API取代了Observer和Observable吗?如果不是,那该怎么办?
我有一个RxJS5管道看起来像这样
Rx.Observable.from([2, 3, 4, 5, 6])
.takeWhile((v) => { v !== 4 })
Run Code Online (Sandbox Code Playgroud)
我想保留订阅,直到我看到4,但我想最后一个元素4也包含在结果中.所以上面的例子应该是
2, 3, 4
Run Code Online (Sandbox Code Playgroud)
但是,根据官方文件,takeWhile运营商不具备包容性.这意味着当遇到与我们给出的谓词不匹配的元素时,它会在没有最后一个元素的情况下立即完成流.结果,上面的代码实际上会输出
2, 3
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,我能实现的最简单方法是什么,takeWhile但也用RxJS发出最后一个元素?
我有一个BehaviorSubject我想要重置 - 我的意思是我希望最新值不可用,就像它刚刚创建一样.
我似乎没有看到一个API来做这个,但我想有另一种方法来实现相同的结果?
我希望的行为是我需要发出事件,并且我希望订阅者在他们订阅时获得最新事件 - 如果特定经理处于"已启动"状态.但是当这个经理被"停止"时,最新的事件应该不可用(就像它从未在第一时间开始一样).
这是一个使用反应香蕉库的Haskell FRP程序示例.我只是刚刚开始尝试使用Haskell,特别是对于FRP的含义并不是很清楚.我真的很感激对下面代码的批评
{-# LANGUAGE DeriveDataTypeable #-}
module Main where
{-
Example FRP/zeromq app.
The idea is that messages come into a zeromq socket in the form "id state". The state is of each id is tracked until it's complete.
-}
import Control.Monad
import Data.ByteString.Char8 as C (unpack)
import Data.Map as M
import Data.Maybe
import Reactive.Banana
import System.Environment (getArgs)
import System.ZMQ
data Msg = Msg {mid :: String, state :: String}
deriving (Show, Typeable)
type IdMap = Map String String
-- …Run Code Online (Sandbox Code Playgroud) 我正在研究一个使用反应性香蕉的程序,我想知道如何使用基本的FRP构建块来构建我的类型.
例如,这是我真实程序的一个简化示例:假设我的系统主要由小部件组成- 在我的程序中,随着时间的推移而变化的文本片段.
我本可以有
newtype Widget = Widget { widgetText :: Behavior String }
Run Code Online (Sandbox Code Playgroud)
但我也可以
newtype Widget = Widget { widgetText :: String }
Run Code Online (Sandbox Code Playgroud)
并使用Behavior Widget时,我想谈谈随时间变化的行为.这似乎使事情"更简单",并且意味着我可以Behavior更直接地使用操作,而不是必须解压缩和重新打包Widgets来执行它.
另一方面,前者似乎避免了实际定义小部件的代码中的重复,因为几乎所有的小部件都会随着时间的推移而变化,我发现自己甚至定义了几个没有的小部件Behavior,因为它让我可以将它们与其他人以更一致的方式.
作为另一个例子,使用两种表示形式,有一个Monoid实例是有意义的(我希望在我的程序中有一个实例),但后者的实现似乎更自然(因为它只是将列表monoid轻微提升到newtype ).
(我的实际程序使用Discrete而不是Behavior,但我不认为这是相关的.)
同样,我应该使用Behavior (Coord,Coord)还是(Behavior Coord, Behavior Coord)表示2D点?在这种情况下,前者似乎是明显的选择; 但是当它是一个代表游戏中某个实体之类的五元素记录时,选择似乎不太清楚.
从本质上讲,所有这些问题都归结为:
使用FRP时,我应该在哪个层使用该Behavior类型?
(同样的问题也适用Event,尽管程度较轻.)
我阅读了使用Scala.React弃用Observer模式,发现反应式编程非常有趣.
但有一点我无法弄清楚:作者将信号描述为DAG(有向无环图)中的节点.那么如果你有两个信号(或事件源,或模型,w/e)相互依赖怎么办?即"双向绑定",如网络前端编程中的模型和视图.
有时它只是不可避免的,因为用户可以更改视图,后端(例如异步请求)可以更改模型,并且您希望另一方立即反映更改.