如何使用 RxJS 显示“用户正在输入”指示器?

2023-12-21

我了解一点 BaconJS,但现在我尝试通过创建“用户正在输入...”指示器来学习 RxJS。这很简单,可以用两个简单的规则来解释:

  1. 当用户打字时,指示器应该立即可见。
  2. 当用户停止键入时,指示器应该仍然可见,直到用户最后一次键入操作后 1 秒。

我不确定这是否正确,但到目前为止我已经创建了两个流:

  1. 发出一个心跳流0每一秒。
  2. 一个流来捕获用户键入事件并发出1对于每一个事件。

然后我将它们合并在一起,然后简单地利用结果。如果它是一个1,然后我显示指标。如果它是一个0,然后我隐藏该指示器。

看起来是这样的:

const showTyping = () =>
  $('.typing').text('User is typing...');

const showIdle = () =>
  $('.typing').text('');

// 1 second heartbeats are mapped to 0
const heartbeat$ = Rx.Observable
  .interval(1000)
  .mapTo(0);

// user typing events are mapped to 1
const input$ = Rx.Observable
  .fromEvent($('#input'), 'input')
  .mapTo(1);

// we merge the streams together
const state$ = heartbeat$
  .merge(input$)
  .do(val => val === 0 ? showIdle() : showTyping())
  .subscribe(console.log);

这是 JSBin 的链接:

http://jsbin.com/vekixuv/edit?js,控制台,输出 http://jsbin.com/vekixuv/edit?js,console,output

我对这个实现有几个问题和疑问:

  1. 有时,当用户打字时,0潜入,因此指示器会闪烁一瞬间,然后在用户下一次击键时返回。
  2. 不保证指示器会在用户停止输入后 1 秒消失。它只能保证指示器会在 1 秒内消失(这与我们想要的相反)。
  3. 使用心跳流是正确的 RxJS 方法吗?我有一种感觉,可能不是。

我有一种感觉,我的实施完全偏离了基础,我感谢您能够提供的任何帮助。谢谢。


你甚至不需要使用两个 Observables,只需要使用一个debounceTime() http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-debounceTime。您尝试制定的所有逻辑都已经存在于debounceTime()操作员:

const showTyping = () =>
  $('.typing').text('User is typing...');

const showIdle = () =>
  $('.typing').text('');

const input$ = Rx.Observable
  .fromEvent($('#input'), 'input')
  .do(() => showTyping())
  .debounceTime(1000)
  .subscribe(() => showIdle());

观看现场演示:http://jsbin.com/cixipa/6/edit?js,控制台,输出 http://jsbin.com/cixipa/6/edit?js,console,output

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 RxJS 显示“用户正在输入”指示器? 的相关文章

随机推荐

  • Rails after_save 回调被多次调用

    我正在尝试通过 mixin 注入 after save 回调 但我的 rspec 测试告诉我 当create方法被调用 为什么该方法被调用两次 以下 rspec 测试失败 it should call callback do Product
  • rhc 设置返回“警告:常量 ::TimeoutError 已弃用”

    环境 Ubuntu 16 04 xenial Linux 内核 4 4 0 22 generic 红宝石 版本 ruby 2 3 0p0 2015 12 25 x86 64 linux gnu 复制步骤 sudo apt get insta
  • 禁用特定页面上的 Javascript 执行 (HTML/PHP)

    是否有任何 HTTP 标头可以禁用特定页面的 Javascript 我的网站提供用户生成的 HTML 内容 这就是为什么我不能只使用htmlenitities 并且我想阻止脚本编写 JavaScript 注入 我已经使用 HttpOnly
  • 为什么在 Scala 中重写的变量会得到错误的值?

    我在 Scala 中有一个 A 类 就像这样 class A val a 3 lazy val b 2 println a a println b b 接下来 我将这个类扩展到另一个 B 类 class B extends A overri
  • MySql:用列表设置变量

    我已经研究 MySQL 语句和类似问题有一段时间了 但我似乎没有任何运气 我可以创建一个变量来存储要在多个查询中使用的 1 列数据结果吗 这样做会有效吗 还是我对 DB 与 PL 的区别感到困惑 我在想类似下面的伪代码 SET list S
  • Pandas - 在方法链中使用分配和 if-else 语句

    我有 R 背景 我正在尝试复制mutate pandas 中 dplyr 的函数 我有一个如下所示的数据框 data name Jason Molly Tina Jake Amy age 42 52 36 24 73 preTestScor
  • 如何在不影响超类的情况下重写 Ruby 子类中的变量?

    假设我有一个带有一些 静态 变量的类 我希望该类的子类能够覆盖这些变量而不影响原始类 使用类变量是不可能的 因为这些变量似乎在子类和超类之间共享 class Foo test a def speak puts test end end cl
  • Eclipse、Git 和 Bitbucket - 无法推送 - 错误 401 未经授权

    我在使用 Bitbucket 和 Egit 时遇到问题 我在 BitBucket 上创建了一个新存储库 还在 Eclipse 中创建了一个新项目 当我尝试推送提交时 收到以下错误消息 Can t connect to any reposit
  • “只能加入可迭代的”python 错误

    我已经看过这篇关于可迭代 python 错误的文章 只能迭代 Python 错误 https stackoverflow com questions 19821026 can only iterable python error 但这是关于
  • Pandas 中的数据帧上采样

    给定按月索引的数据帧 我想按天重新索引 上采样 以前按月索引的值现在应除以该月的天数 try tidx m pd date range 2011 01 31 periods 2 freq M tidx d pd date range 201
  • 获取python的itertools循环当前元素

    我知道你可以使用c cycle a b c 使用在元素之间循环c next 但是有办法获取迭代器的当前元素吗 例如如果c next 回 c 这意味着迭代器位于 b 前 有什么方法可以让我得到 b 不使用next 迭代器 生成器没有任何方法来
  • XSD 验证 xs:date 和 xs:dateTime 的错误格式

    当我设置year如下所示的部分 20512 或类似的内容 XSD 仍然验证 XML 任何想法 这是一个缺陷还是我必须使用简单类型与给定的模式 Thanks XSD
  • 在 Yii 中,有没有办法使用 CActiveForm 验证表格输入?

    情况 我使用了 Yii 网站上的 wiki 文章 收集表格输入 http www yiiframework com doc guide 1 1 en form table 以如下为例 我不认为我需要针对多个模型验证传统意义上的表格输入 我只
  • 与静态库的链接不等于与其对象的链接

    Problem 与静态库链接时生成的固件映像与与直接从静态库中提取的对象链接时生成的固件映像不同 两个固件映像都没有错误地链接并成功加载到微控制器上 后一个二进制文件 与对象链接 按预期成功执行 而前一个二进制文件 链接到静态库 则不然 编
  • URLWithString:返回 nil

    这可能很容易 但我似乎不明白为什么URLWithString 在这里返回零 localisationName is a arbitrary string here NSString webName localisationName stri
  • jquery隐藏预加载[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 这是我的页面http equipe94 com 2009e html http equipe94 com 2009e h
  • 为什么这个任务提前返回?我做错了什么吗?

    我正在尝试设置一群具有最小耦合的工作人员 但我想使用 C async和任务 并非所有任务都是纯异步的 有些任务是完全同步的 这样做的动机是我想创建一些执行业务逻辑的简单方法 并使用System Threading Tasks TaskAPI
  • 检测 Mac OS X 上的调试器

    我试图检测我的进程是否正在调试器中运行 在 Windows 中有很多解决方案 在 Linux 中我使用 ptrace PTRACE ME 0 0 0 并检查其返回值 我没有设法在 Mac OS X 上执行相同的基本检查 我尝试使用 ptra
  • 请解释一下使用 std::ignore 的这段代码

    我正在阅读有关的文档std ignore http en cppreference com w cpp utility tuple ignore来自 cppreference 我发现很难掌握这个对象的真正目的 并且示例代码并没有很好地说明这
  • 如何使用 RxJS 显示“用户正在输入”指示器?

    我了解一点 BaconJS 但现在我尝试通过创建 用户正在输入 指示器来学习 RxJS 这很简单 可以用两个简单的规则来解释 当用户打字时 指示器应该立即可见 当用户停止键入时 指示器应该仍然可见 直到用户最后一次键入操作后 1 秒 我不确