antvis / data-set

state driven all in one data process for data visualization.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Bug: data-set 连续两次改变不同状态量,后一次状态改变会把前一次的改变取消。

kingecg opened this issue · comments

我在dataset里面有两个data view: timev 和 timev2.

  • timev 关注的状态量为['start','timev']
  • timev2 关注的状态量为['start','timev2']
    在为两个view初始填入数据时,会改变view名字对应的状态以触发view重新run transform
//该代码只会触发timev2的刷新
this.timeSource.addViewData('timev',data)
 this.timeSource.addViewData('timev2',data1)
// 拉开两次设置数据的时间,则两个view都能够刷新
setTimeout(()=>{
      this.timeSource.addViewData('timev',data)
    },100)
    setTimeout(()=>{
      this.timeSource.addViewData('timev2',data1)
    },500)
  • Link:
  • Platform:
  • Mini Showcase(like screenshots):

麻烦提供可复现的 codepen 链接

麻烦你看下data-set.js第59行。这个问题就出在这里。

这里的逻辑只是控制同步的 n 次 setState 只会在一个 frame 里触发一次 statechange 事件,只要你的 state key 是不同的,一定不会撤销。你是不是用了同一个 state 名称?发 codepen 吧,我没法猜测你的场景

因为emit动作在timer里面。当连续两个setState改变不同状态时,第一个还没有emit事件就被取消了。

之前说了,同步调用的多次 setState 只会触发一次 statechange 事件,state 变更是生效的,事件只会触发一次,这个和 react 的 setState 行为是相似的

问题是,API承诺的是

  1. 不同的View可以关注dataset不同的状态。
  2. 状态发生改变后,关注状态的View会被update
    考虑这样的Case:
  3. dataset里面有stateA,stateB两个状态量,分别被Va, Vb关注
    2.先更新stateA,再更新stateB. 如果按照你说的,只有最后一次更新生效。那么只有关注stateB的视图Vb被更新。
    实际上,这里的需求是Va和Vb都要被更新

肯定都更新了,只是只更新一次。你的代码没有复现这个场景

事件只触发一次,不代表 va 和 vb 不被更新,你不要偷换概念