问题标签 [reactive-extensions-js]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
320 浏览

javascript - 2 个依赖流的安全更新

作为一项练习,我正在尝试构建 2 个相互更新的依赖流。

测试应用程序只是一个“英寸 <-> 厘米”转换器,两个输入均可编辑。

我遇到的问题是我无法理解如何停止导致一个字段更改的递归。

为了更好地解释这个问题,让我们看一下代码的相关部分:

所以我们定义了 Subjects 每个都持有当前对应的值。

现在想象我们将英寸值更改为2(使用inValue.onNext(2);或通过键盘)。

接下来会发生什么 - 处理程序 #2 被触发并调用相应的以厘米为单位的值的重新计算。结果cmValue.onNext(0.7874015748031495)

这个调用实际上由处理程序#1 处理,并使用0.7874015748031495 * 2.54导致另一个inValue.onNext(1.99999999999999973)调用的公式重新计算以英寸为单位的值(我们手动输入的值)。

幸运的是 - 由于 FP 舍入误差,我们停止了。但在其他情况下,这可能会导致更多循环甚至无限递归。

如您所见-我部分解决了应用问题,该问题.distinctUntilChanged()至少可以保护我们免受任何更改的无限递归,但正如我们所见-在这种情况下,它并不能完全解决问题,因为值不相同(由于 FP 操作自然)。

所以问题是:如何实现一个根本不会导致自递归的通用双向绑定?

我强调通用是为了说明使用.select()四舍五入将是这个特定问题的部分解决方案,而不是通用的(我和其他所有人都喜欢)。

完整代码和演示:http: //jsfiddle.net/ewr67eLr/

0 投票
2 回答
1759 浏览

javascript - 从流 onError 中恢复的惯用方法

免责声明:它是先前安全更新 2 个依赖流问题的延续

在允许流不终止的 RxJS(或任何其他 RX 实现)中处理错误的惯用方法是什么?

相关代码是

如您所见,我们使用输入字段更改流并将其传递给convert将其转换为另一个单元并进一步传递结果的函数。

如果在$.ajax()调用期间发生错误,那么它会向上传播并且整个inchescetimeters流停止(实际上是预期的)。

但是我将如何实现它不这样做呢?

这样我就可以优雅地处理错误,例如显示错误消息并在新数据到达时重试?

我目前的想法是引入像 Haskell's 这样的复合类型Data.Either并将其流式传输而不是标量双精度数。

想法?

UPD:是的,我已经阅读了在响应式扩展中处理异常而不停止序列,但我仍然希望有更好的方法。

0 投票
1 回答
525 浏览

javascript - 我有一个 Rx.Subjects 链(A->B->C->A),但最后一步不起作用

活生生的例子。

我对 Rx* 完全陌生。我正在尝试使用 RxJS 为我的论文创建 MVC 的反应式版本。它松散地基于https://github.com/staltz/mvi-example

在开始编写代码之前,我可能应该更多地研究 RxJS,但我意识到我通常通过跳到池的最深处来学习最好的东西。现在我完全被困住了。

视图有一个带有数值的文本字段和一个按钮。按下按钮会更改文本的颜色,单击文本会迭代数值。该值存储在模型中,因此“链”通过所有三个对象(视图->控制器->模型->视图)。按下按钮不需要模型,因此链是 View->Controller->View。

其他一切正常,但链的最后一部分(-> 查看)给我带来了麻烦。单击文本(在视图中)会将更改传播到控制器和模型,但视图不会通知模型中的更改。我不明白为什么,因为我理解这一切的方式都是以相同的方式实现的。

我在下面的代码示例中添加了注释,以指定不被调用的函数。

代码可在此处获得。请注意,就像我说的,代码是针对我的论文的,所以一些设计决策和应用程序本身可能看起来很奇怪。下面我还尝试包括我认为最相关的部分。我知道我应该提供一个完整的例子,但在这种情况下这是不可能的。

对象获取的“obs”参数是我用来存储可观察对象的内部数据结构。相关部分是

查看.js

控制器.js

模型.js

所以问题是 View.setValue() 和 View.setNumberColor()。

0 投票
2 回答
752 浏览

frp - 将单击与单击并按住分开

我需要实现一个行为:

  • 单击元素时-发生一件事
  • 但是当它被单击并按住超过一秒钟时,会发生其他事情(例如元素变得可拖动),然后第一个事件永远不会触发

我想我知道如何捕捉 click&hold 类型的事件,但是如何区分第一个和第二个?

你能告诉我如何使用这个jsbin来做到这一点。我已经制作了“单击、按住和拖动”部分,只是在拖动元素后它仍在触发“单击”事件,但它不应该。

再次:单击元素 - 一个事件,单击并按住 - 元素是可拖动的(即使在鼠标向上之后),当再次单击时,它会恢复到正常(不可拖动)状态。

我不是在寻找一个微不足道的解决方案,它必须使用Rx.Observable或至少是培根的streamEvent对象来构建

谢谢

0 投票
3 回答
923 浏览

javascript - RxJS:带有中止的生产者-消费者

我在 RxJS 中有一个特殊的生产者消费者问题:生产者缓慢地生产元素。消费者正在请求元素,并且通常必须等待生产者。这可以通过压缩生产者和请求流来实现:

有时请求会中止。生成的元素只应在未中止的请求后使用:

第一个请求r1将消耗第一个生成的元素p1,但在它可以消耗之前r1被中止。产生并在第二次请求时被消耗。第二次中止被忽略,因为之前没有发生过未回答的请求。第三个请求必须等待下一个生成的元素,并且在生成之前不会中止。因此,它在生产后立即被消耗。a(r1)p1p1c(p1, r2)r2a(?)r3p2p2p2c(p2, r3)

如何在 RxJS 中实现这一点?

编辑: 我在 jsbin 上创建了一个带有 QUnit 测试的示例您可以编辑该功能createConsume(produce, request, abort)以尝试/测试您的解决方案。

该示例包含先前接受的 answer的函数定义。

0 投票
1 回答
1260 浏览

javascript - 无法从 JS 事件创建 Rx.Observable

我试图弄清楚如何将rx.js与狗简单的示例一起使用,但无法弄清楚我缺少什么参考或文件,这意味着它不起作用。

字面意思就是这样。该脚本行正确加载了从 nuget 新下载的 rx.js 2.4.1 的本地副本。

我收到错误 Rx.Observable.fromEvent is not a function,所以我假设缺少参考。

这可能只是晚上的时间,但我正在努力看看我做错了什么。有什么帮助吗?

0 投票
1 回答
2605 浏览

angularjs - RxJS - 加载指示器

我正在努力理解为 AJAX 流显示加载指示器的“Rx”方式。

据我了解,我应该使用.do()副作用,我认为设置loading是,但感觉不是正确的做事方式。

谁能提供一个更清洁/更好/正确的例子来说明如何做到这一点?

谢谢!

更新 1

我决定把它分成两个流;requestSourceresponseSource

然后有 2 个单独的订阅者:

我喜欢这种方法,因为它使订阅者的角色保持准确。响应订阅者不需要关心设置loadingtrue. 它只关心将其设置为false.

0 投票
2 回答
1087 浏览

javascript - Rx.Observable.groupBy 会清理空流吗?

在 Node 应用程序中,我正在尝试使用 RxJS 处理事件流。事件流是对许多文档的更改列表。我正在使用 groupBy 通过 documentId 将流划分为新流。但我想知道,一旦在客户端关闭文档并且没有新事件添加到该 documentId 的流中,groupBy 会在该文档的流为空时处理它吗?如果没有,我将如何手动执行此操作?我想避免由正在创建但从未销毁的新文档流引起的内存泄漏。

0 投票
4 回答
1702 浏览

javascript - 使用 RxJS 创建可过滤列表

我正在尝试进入反应式编程。我一直使用 map、filter 和 reduce 之类的数组函数,并且喜欢我可以在不创建状态的情况下进行数组操作。

作为一个练习,我正在尝试使用 RxJS 创建一个可过滤的列表,而不引入状态变量。最后它应该类似于这样工作:

在此处输入图像描述 在此处输入图像描述

我会知道如何使用幼稚的 JavaScript 或 AngularJS/ReactJS 来完成此操作,但我试图仅使用 RxJS 并且不创建状态变量来完成此操作:

现在,如何将搜索值添加到我从列表中创建的 observable 上的过滤器函数中?

非常感谢你的帮助!

0 投票
2 回答
4725 浏览

javascript - 如何使用 rxjs 存储扫描的累积结果

我有两个合并后的可观察对象,合并后进行扫描。第一个是简单范围,另一个是主题。每当主题发出一个新值时,onNext我在扫描中连接该值并将新数组作为累加器返回。如果我处理我的订阅,然后再次订阅,它会重播该范围内的值,但我已经丢失了主题中的值。在下面的代码中,我希望我的第二次订阅的最终值为[1, 2, 3, 4, 5]

最好的方法是什么?现在我有另一个主题,我在其中存储最终值并订阅它,但感觉不对。

这是一个简单的版本,演示了正在发生的事情:

这输出: