标签: reactive-programming

JavaScript中的功能反应式编程是否会导致侦听器引用出现更大的问题?

在JavaScript中,经常使用观察者模式.它有一个棘手的问题,那就是主体对观察者的参考.他们需要清理.对于常规应用程序,我使用以下经验法则:

  • 如果受试者的寿命短于(或等于)观察者,我可以这样做 subject.on('event', ...)
  • 如果受试者的寿命比观察者长,我需要使用 observer.listenTo(subject, 'event', ...)

在第二种情况下,listenTo它意识到观察者的生命周期,并且当观察者死亡时它将自动移除听众.

在现代SPA(单页应用程序)样式中,只有部分应用程序在任何时候都处于活动状态,这一点变得非常重要.如果将它与Web套接字结合起来,这是一个完美的事件流候选者,并且很可能长寿,这就变得更加重要.

使用FRP,类似于表示随时间变化的值的事件流,我(不知道)创建了大量的监听器.每个filter,mapflatMap创建一个绑定(可能使用一个监听器)到前一个流的新流.

在我看来,确定如何以及何时需要删除这些侦听器似乎相当棘手.我无法想象我是第一个考虑这个问题的人,但我在互联网上找不到这个.

我看到其他语言中的一些框架使用弱引用.JavaScript没有弱引用的概念(WeakMap在这里不可用).即使它有,但它似乎是一个坏主意,因为它不清楚垃圾收集何时发生.

  • 在当前的框架中如何解决这个问题?
  • 框架是否与对象的生命周期相关联?如果是的话:怎么样?

javascript reactive-programming rxjs elm bacon.js

18
推荐指数
1
解决办法
976
查看次数

与Angularjs 1.X中的$ watch相比,rxjs observable的表现如何?

我从各种演讲者那里听说,$ watch对于你的应用程序的性能是多么危险.我想知道是否有人在AngularJS应用程序中比较了Rxjs的Observable与$ watch的性能.我知道Observables将成为Angular 2的一部分.

reactive-programming observable rxjs angularjs

18
推荐指数
1
解决办法
5999
查看次数

如何创建rx.Single的缓存/热门版本?

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(),但缓存并返回相同的结果?

java reactive-programming kotlin rx-java

18
推荐指数
1
解决办法
3266
查看次数

RxJS distinctUntilChanged - 对象比较

我有对象流,我需要比较当前对象是否与以前相同,在这种情况下发出新值.我发现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)

reactive-programming rxjs angular

18
推荐指数
6
解决办法
1万
查看次数

18
推荐指数
1
解决办法
1231
查看次数

RxJS takeWhile但包括最后一个值

我有一个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发出最后一个元素?

reactive-programming rxjs rxjs5

18
推荐指数
2
解决办法
5710
查看次数

如何重置BehaviorSubject

我有一个BehaviorSubject我想要重置 - 我的意思是我希望最新值不可用,就像它刚刚创建一样.

我似乎没有看到一个API来做这个,但我想有另一种方法来实现相同的结果?

我希望的行为是我需要发出事件,并且我希望订阅者在他们订阅时获得最新事件 - 如果特定经理处于"已启动"状态.但是当这个经理被"停止"时,最新的事件应该不可用(就像它从未在第一时间开始一样).

stream reactive-programming rx-java rx-java2

18
推荐指数
2
解决办法
2万
查看次数

我使用反应性香蕉吗?

这是一个使用反应香蕉库的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)

haskell zeromq frp reactive-programming reactive-banana

17
推荐指数
1
解决办法
2220
查看次数

在FRP中应用行为(和其他类型)的位置

我正在研究一个使用反应性香蕉的程序,我想知道如何使用基本的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,尽管程度较轻.)

haskell frp reactive-programming

17
推荐指数
2
解决办法
467
查看次数

如何相互依赖处理这两个信号?

我阅读了使用Scala.React弃用Observer模式,发现反应式编程非常有趣.

但有一点我无法弄清楚:作者将信号描述为DAG(有向无环图)中的节点.那么如果你有两个信号(或事件源,或模型,w/e)相互依赖怎么办?即"双向绑定",如网络前端编程中的模型和视图.

有时它只是不可避免的,因为用户可以更改视图,后端(例如异步请求)可以更改模型,并且您希望另一方立即反映更改.

scala frp reactive-programming

17
推荐指数
1
解决办法
1240
查看次数