Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

同时执行多个同步 Action 会出现前一个 action 的操作被覆盖问题 #66

Closed
imsobear opened this issue Feb 27, 2020 · 4 comments
Assignees
Labels
bug Something isn't working

Comments

@imsobear
Copy link
Member

@imsobear imsobear added the bug Something isn't working label Feb 27, 2020
@alvinhui
Copy link
Member

alvinhui commented Mar 4, 2020

1.0 版本由于无法区分同异步 function, 所以同步 action 也被当做异步来做处理了。

为了解决这个问题,有几种可行的处理方案:

方案一

对于异步 action 不允许直接修改 state,调用同步方法:

{
  state: {},
  actions: {
    addBy: (prevState, payload) => ({...prevState, count: prevState.count + payload}), 
    addByAsync:  async(state, payload, actions) =>  {
      await delay(1000)
      actions.addBy(payload)
    }
  }
}

实现这样的 API 的前提是在内部能够对方法进行区分处理(判断是否是异步方法然后做特殊处理)。我留意到了在 stackoverflowTC 39 下的讨论。
目前来看,在编译后的代码中判断是否是异步似乎没有可行的方式。

因此该方案是不可行的

方案二

区分同步和异步方法:

{
  state: {},
  reduces: {
    addBy: (prevState, payload) => ({...prevState, count: prevState.count + payload}), 
  },
  effects: {
    addByAsync:  async(state, payload, actions) =>  {
      await delay(1000)
      actions.addBy(payload)
    }
  }
}

内部实现上来说比较简单,但对于用户来说其缺点是我之前所描述过的「纯对象好处」的反例:#59 (comment)

在版本策略上:

  • 发布 2.0.0,区分 effects 和 reducer;
  • 发布 1.1.0,添加 warning 提示用户升级到 2.0.0。

方案三

为了尽量减少用户升级的成本和版本的分化,将「区分同步和异步方法」(参考方案二)作为新 feature。

发布 1.1.0:

  • 添加该 feature,同时有 actions 的 model 在创建时 console.error 提示;
  • 添加 useEffectsState 方法,同时将 useActionsState 方法设置为已过期的。

@imsobear
Copy link
Member Author

imsobear commented Mar 4, 2020

牵扯到两个变化:

  1. 异步 action 不允许修改 state
  2. actions 需要拆分成 reducers 和 effects

目前看来这两个变化是不可避免的,而且是两个实实在在的 break change,版本策略上发 1.1.0 风险是否可控(包括 icejs 里的依赖)?

@alvinhui
Copy link
Member

alvinhui commented Mar 4, 2020

严格地按照版本策略来说,这个 break change 确实应该升级为 2.0.0 。
icejs 的 plugin store 也需要发版本,同时需要添加错误提醒:发现它定义的 model 里有 actions 字段,提示它修改为 effects/reducers 的形式。

@chenbin92

@alvinhui
Copy link
Member

alvinhui commented Mar 4, 2020

最终决定使用方案三,PR:#65

@alvinhui alvinhui closed this as completed Mar 4, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

2 participants