- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我第一次尝试响应式编程,使用 bacon.js ,并遇到了一个让我很烦的奇怪的互动。我想出了这个事件链的一个工作版本,但是 hackish 的额外流操作使它从其余代码中脱颖而出——如您所见。
我发现 FRP/Bacon.js 生成了一些非常干净的代码,所以感觉我只是缺少一些明显的运算符。对于这个问题,我们好吗?
多个来源建议使用 Observable.flatMapLatest
丢弃过时的事件。假设我们要为一个输入流中的每个事件完成一个IO操作。在下图中,i
表示输入流事件,rN
s 代表每个请求流的事件和 x
es 标记请求流被取消的时间点。这些很可能是单事件流,因此 .
意味着流实际上在事件之后关闭(如果之前没有取消!)。
input stream: i──i────────i───i─────────>
request: │ │ │ └────r4.──>
request: │ │ └───x─r3.─────>
request: │ └──r2.───x─────────────>
request: └──x─────r1.──────────────>
+
i.flatMapLatest(requests): ──────r2─────────────r4───>
这对于几个用例来说完全没问题,但要注意 r3
: 它永远不会被接受,即使它在 r4
之前仍然是一个有效的响应到达的。在最坏的情况下,很多请求都被浪费了:
input stream: i──i──i───i──i──────>
request: │ │ │ └──x─r4.──>
request: │ │ └───x─r3.─────>
request: │ └──x─r2.─────────>
request: └──x─────r1.────────>
+
i.flatMapLatest(requests): ────────────────────>
我知道我们可以使用 throttle
和 debounce
来处理这些情况,但它们仍然容易受到(更大的)时间问题的影响。例如,连接不稳定(请求耗时 0.5 秒到 5 秒以上)的用户可能会受此影响。
现在,即使这不是一个真正的问题,它看起来对我的 FRP 研究也很有值(value)。如果现在还不清楚,这就是我想要做的:
input stream: i──i────────i───i─────────>
request: │ │ │ └────r4.──>
request: │ │ └─────r3.─x───>
request: │ └──r2.──────────x──────>
request: └──────x─r1.──────────────>
+
i.flatMap_What?(requests): ──────r2──────────r3─r4───>
这是我当前的实现与基本的 flatMapLatest
一:
var wrong = function (interval, max_duration) {
var last_id = 0,
interval = interval || 1000,
max_duration = max_duration || 5000;
Bacon.interval(interval, 'bang').log('interval:')
.flatMapLatest(function () {
return Bacon.later(Math.random()*max_duration, last_id++).log(' request:');
})
.log('accepted: %s **********');
};
var right = function (interval, max_duration) {
var last_id = 0,
interval = interval || 1000,
max_duration = max_duration || 5000;
Bacon.interval(interval, 'bang').log('interval:')
.flatMap(function () {
return Bacon.later(Math.random()*max_duration, last_id++).log(' request:');
})
.diff(-1, function (a, b) { return b > a ? b : -1 })
.filter(function (id) { return id !== -1 })
.log('accepted: %s **********');
};
wrong
函数按预期忽略连续请求,而 right
函数在普通 flatMap
上运行用diff
和 filter
.但这不仅看起来非常 hacky,它还添加了时间戳/id 作为请求的要求,以便我们稍后对其进行排序。
我想我的问题是:我错过了什么?有一个更好的方法吗?我怎样才能takeUntil
每个 flatMap
事件流(请求)而不是外部事件流(输入)?
感谢任何帮助,谢谢!
最佳答案
这是一个使用最大 ID 和扫描的解决方案:
var right = function (interval, max_duration) {
var bang_id = 0, last_id = 0,
interval = interval || 1000,
max_duration = max_duration || 5000;
Bacon.interval(interval, 'bang')
.map(function() { return 'Bang'+(bang_id++) })
.flatMap(function (val) {
return Bacon.later(Math.random()*max_duration, {value: val, id: last_id++});
})
.scan({id: -1, value: null}, function(memo, v) {
if(v.id <= memo.id) {
return memo;
}
return v;
})
.changes()
.skipDuplicates(function(a, b) { return a.id === b.id; })
.map('.value')
.log();
};
关于javascript - Observable.flatMap最新: Cancel at a deeper level?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29850928/
大家好,我知道这段代码的作用: 1.]我的第一个问题 x = 4 y = x 但是这个呢。为什么即使在这种情况下也使用相同的地址? x = 4 y = 4 id(x) 12345678 id(y) 1
我正在使用 SFML 2.3 来控制程序中的图形。我需要一个类才能访问窗口,即使该类不是最初创建窗口的类(没有所有权)也可以绘制它。例如。 Battle 类需要能够绘制战斗场景并在那里操作角色,但是
我不知道该如何描述?我认为如果你看看我制作的 jsfiddle 会更好.. 如您所见,某些 TR 元素上有悬停,如果 TD 已经有另一个 bgcoler,它必须更改为替代 bgcolor.. 它在前
我的意思是,虽然你可以这样做: $foo = "Yo dawg I herd you like $bar->baz"; 这个: $foo = "Yo dawg I herd you like $bar
首先。对不起我的标题,我已经考虑了十多分钟我要命名我的问题。但是我什么也没得到.. 在我的应用程序中,我有三个基本属于彼此的组件。 我有: Doors.js DoorsItem.js DoorsDet
我第一次尝试响应式编程,使用 bacon.js ,并遇到了一个让我很烦的奇怪的互动。我想出了这个事件链的一个工作版本,但是 hackish 的额外流操作使它从其余代码中脱颖而出——如您所见。 我发现
在 PhpStorm 中,如果我创建了一个对象,那么该对象的所有自动完成功能都可以正常工作: $object = new MyClass(); $object->getNa... 将自动完成 $obj
假设我想高效地从 xml 文档中选择所有 field 节点。该文档可能如下所示:
在 Angular2 中有没有办法为异步代码获得更好的调用堆栈?我一直认为跟踪 setTimeout()、发出的事件、Promises 等的执行上下文是 Zone 的优势之一? 我构建了一个 plun
我的模型相关如下: Post BELONGS_TO Parent Parent HAS_MANY ParentAdmin 现在,如果满足帖子的属性值,我希望找到所有帖子的所有父级管理员。等效的 sql
几年前,我和我的兄弟为 Mandelbrot 集编写了 Java 代码。昨天我想用它找到一些很酷的变焦,但当我进行更强烈的变焦时,我开始注意到一个问题(变焦值约为 1E14)。像素似乎被组合在一起,有
我已经在 StackOverflow 上阅读了许多 Tic Tac Toe 主题。我发现维基百科上的策略适合我的演示项目: A player can play perfect tic-tac-toe
这个问题在这里已经有了答案: Convert a JavaScript string in dot notation into an object reference (34 个答案) 关闭 5 年
除了开发人员工具网络面板提供的功能之外,我如何更深入地了解网络浏览器的网络级别发生了什么?例如,我现在正尝试在 Firefox (18.0.1) 中调试页面上的一个问题,在页面加载完成后加载“微调器”
我是一名优秀的程序员,十分优秀!