- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 RxJS 捕获用户击键,并为每个击键生成一个结果对象,其中包含键、击键的持续时间(时间keyup
和 keydown
事件之间),以及先前笔划之间的间隔(使用 timeInterval
)。请参阅下图了解概述。
到目前为止,我的代码正在运行:Hello
输出 ShiftLeftHELLO
。
但是当我写得更快时(像往常一样),一切都会崩溃,World
输出ShiftLeftShiftLeftOLD
。
您对实现backpressure有什么建议吗? 、缓冲或我的代码中的其他内容来防止这种行为?
(function (document) {
var textarea = document.querySelector("#input");
var keyUpStream = Rx.DOM.keyup(textarea);
var keyDownStream = Rx.DOM.keydown(textarea);
var keyStrokeStream = Rx.Observable.merge(keyDownStream, keyUpStream);
var keystroke = keyStrokeStream.filter((function() {
var keysPressed = {};
return function(e) {
var k = e.which;
if (e.type == 'keyup') {
delete keysPressed[k];
return true;
} else if (e.type == 'keydown') {
if (keysPressed[k]) {
return false;
} else {
keysPressed[k] = true;
return true;
}
}
};
})())
.distinctUntilChanged(function (e){
return e.type + e.which;
})
.timeInterval()
.bufferWithCount(2)
.zip(function (evts){
return {
"ts" : Date.now(),
"key": evts[0].value.code,
"evts" : evts,
"duration" : evts.reduce(function(a, b){
return b.value.timeStamp - a.value.timeStamp;
})
};
}).subscribe(function (e){
console.log(e);
document.querySelector("#output").textContent += e.key.replace("Key", '');
document.querySelector("#console").textContent += JSON.stringify(e);
});
})(document);
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/4.1.0/rx.all.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs-dom/7.0.3/rx.dom.js"></script>
<h1>KeyStroke</h1>
<textarea id="input" rows="5" cols="50"></textarea>
<div id="output"></div>
<div id="console"></div>
最佳答案
免责声明:这里是 Rxjs 菜鸟。
问题是您的代码期望在同一键按下键后再按下该键。当您快速打字时,您会遇到击键竞争条件,从而导致缓冲区中出现多次按键或按键。不是您在缓冲区中所期望的。
我修改了代码以利用您的过滤功能。该函数仅返回 keyup 事件,并保存相应的 keydown 笔划。这样,您就可以计算过滤函数内的间隔。我非常确定有一个仅使用 RxJS 函数的更优雅的解决方案,但由于您已经在过滤器函数中使用了状态,所以我对其进行了一些修改。
该代码片段现在显示正确的输出。我认为它解决了你的问题,但这不是使用 RxJS 的好方法(正如我所说,我们在过滤器函数中存储状态)。
(function (document) {
var textarea = document.querySelector("#input");
var keyUpStream = Rx.DOM.keyup(textarea);
var keyDownStream = Rx.DOM.keydown(textarea);
var keyStrokeStream = Rx.Observable.merge(keyDownStream, keyUpStream);
var keystroke = keyStrokeStream.filter((function() {
var keysPressed = {};
return function(e) {
var key = e.which;
var result;
if (e.type == 'keyup' && keysPressed.hasOwnProperty(key)) {
e.strokeInterval = Date.now() - keysPressed[key];
delete keysPressed[key];
return true;
} else if (e.type == 'keydown') {
if (!keysPressed.hasOwnProperty(key)) {
keysPressed[key] = Date.now();
}
return false;
}
return false;
};
})())
.map(function (evt){
return {
"ts" : Date.now(),
"key": evt.code,
"duration" : evt.strokeInterval
};
})
.subscribe(function (e){
console.log(e);
document.querySelector("#output").textContent += e.key.replace("Key", '');
document.querySelector("#console").textContent += JSON.stringify(e);
});
})(document);
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/4.1.0/rx.all.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs-dom/7.0.3/rx.dom.js"></script>
<h1>KeyStroke</h1>
<textarea id="input" rows="5" cols="50"></textarea>
<div id="output"></div>
<div id="console"></div>
关于javascript - 在 RxJ 中使用背压进行击键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36224872/
我不知道如何解决以下问题。 有一个对象类型: Box { Fruit[n]: { Kinds[n]: { id: string; name: st
简单问题:出现错误时 .do() 会触发吗?文档说:“对源 Observable 上的每次发射执行副作用,但返回与源相同的 Observable。”错误也被视为排放吗? return this.aut
DRY(不要重复自己) 假设我在我的应用程序中经常使用此代码: observable$.pipe( tap(value => console.log(value)), map(value =>
我想在我的网站中创建搜索引擎。我想使用 switchMap 取消之前的请求,因为这个函数运行异步。 我通过 keyup 从输入中获取数据,例如: typescript subject = new S
我正在尝试使用 RxJS 捕获用户击键,并为每个击键生成一个结果对象,其中包含键、击键的持续时间(时间keyup 和 keydown 事件之间),以及先前笔划之间的间隔(使用 timeInterval
您以前见过这个问题,但我想了解这个问题在 RxJs 中的流程。 array1 = ["cat", "dog", "taco"] array2 = ["cat", "dog", "fish"] 过滤ar
我有以下属性 private messages$: BehaviorSubject>; public readonly messages: Observable>; 我正在通过 this.me
我只是想使用map函数,但它抛出一个错误。在results.map(results =>等)里面,它说“符号映射无法正确解析,可能它位于无法访问的模块中” , import { Component,
在RxJava中,有Observable.OnSubscribe当有东西订阅可观察对象时,它将调用您的操作。 RxJs 中有等效的吗? 自从提出这个问题以来,他们似乎已经删除了该页面。 Google的
我无法理解使用 Lodash 可以轻松完成的事情。我需要 groupBy 和 sum,类似这样,仅使用 RxJs: let arr = [ {n: 'a', q: 1 },
我的应用程序中有 2 项服务。一个通过网络加载 youTube 评论线程和评论的 youTube 服务,以及一个管理批量评论加载的评论服务。评论服务特定于我的应用,youTube 服务与应用无关。 我
我想使用 RxJs (5.0.0-Beta.6) 和 TypeScript (1.8.10) 创建一个 JS 库>. 我的简单 TypeScript 文件正在编译。我有这个文件: MyLib.ts:
我正在编写一个需要很长时间运行的进程,并且我正在寻求优化已用内存 我有一个随着时间推移而来的数据流,我想要一种方法来在流完成时清理这些数据和声明的变量。有什么想法吗? 我已经设置了一个问题的快速示例:
我是一名优秀的程序员,十分优秀!