MithrilJS Stream.combine() 违反原子更新语义。
作者: dvdkhlng创建于 2020年9月4日更新于 2024年9月2日
标签Type: BugArea: Stream
** Mithril 版本:**"next"分支(rev dca44b14aba9994c236af3dcc5b7845c31cf80b1). 浏览器和操作系统: Ubuntu / Firefox 80
以下单元测试代码(使用微小测试)说明了这一问题:
var a = m.stream (); ; 水分
var b = a.map (x => x+1);
var c = b.map (x ×××××1);
var nums Updates=0 (中文(简体) ).
var d = m.stream.lift ((x,y)) { numupdates ++; return x*y }, b, c; {; {;
eq( 0), 数字更新日期;
/ * 已经用于触发两个更新的初始更改: c( ) 后是
c()三重机 d()和 b() 已经准备好。
然后重现出局, 返回到 b 的依赖性 Streams 更新
循环,其中b()再次触发d(). * 《大会正式记录,第五十七届会议,补编第6号》(A/C.5/56/6),第二章。
a(5);
eq (1, 数字更新);
eq(6*7,d());
/ * 第二次修改还应仅触发一次d()的更新*
数字更新=0;
a(6);
eq(7*8,d());
eq (1, 数字更新);最后两项eq()断言WRT numUpdates被违反(numUpdates将作为2报告). 这与manual直接相矛盾,后者指出: *"Mithril中的Computed professions在原子上更新:依赖多条流的流在每次更新值时,永远不会被称作不止一次的流[.]".
这个问题可以通过确保组合()只将变化推向下游来固定,此前所有地图员都收到了由上一个倒置的 changing()所广告的更新.
以下的补丁为我解决了这个问题(但对于Mithril编码库可能不够好,我的js编码技能有限).
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你来干什么? diff -- git a/ stream/ stream.js b/ stream/ stream.js 互联网档案馆的存檔,存档日期2013-12-02. 指数98f41d96.308407af 100644 -- -- a/流/流.js b/ 流/流.js +-110,15+110,19 +-函数组合(fn, 溪流) { var 已更改 = []
var 映射符 = stream.map(函数) {
- 返回 s. map(函数(值){
- var 映射符 = s. map(函数( 值) { 已更改. push(s)
- 如果(已准备好 QQ 溪流. every (函数) { return s. state !="待决"}) {
- 准备好了=是真的
- var finalCchange = mappers.every(函数) { return mapper = || s. state!"; ===================================================================================================================================================================================================================
- var got Ready = ready = 已准备好 {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
- 键
- 如果( 最终变化 QQ 得到 Ready) { stream( fn.apply (null, streams.concat ([已更改)) ) (中文(简体) ). 已更改 = []
- 准备 = 真实; {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? 返回值 -对,对
- 返回映射器; ) (中文(简体) ).
var 端点Stream = stream.end.map(函数(值){
这只是问题的一半。 Stream.combine () 不传播 changing () 下游信号 。 这导致了更多的原子语义学在将Stream.combine ()连锁起来时的错误行为. 参看尽管有上述修正,但仍然失败的单位测试:
[JavaScript]
var a = m.stream (); ; 水分
var b = a.map (x => x+1);
var c = b.map (x ×××××1);
var d = m. stream.lift ((x,y) *x *y, b,c);
/ * stream.combine () 用于不转发
. . . . . . .内容来源: MithrilJS/mithril.js