vuex中action什么时候完成以及如何正确调用dispatch的思考

在项目中遇到关于action与dispatch使用的一些细节问题,通过搜索获得了一些答案。
特地在此提出,若有错误还请指出,十分感谢~vue

问题1:若是action是异步的,那么怎么知道它何时完成?

  • 在vuex的官网给出了通用方法:
  • 图片描述
  • (1) dispatch一个异步action一般接一个then()来跟进后续的逻辑
  • (2) 若是业务是有时序的多个action的异步组合,用async/await的写法会更直观一点

问题2: 若是action是同步的,是否还须要使用then来接dispatch的后续操做?

提出这个疑问主要是由于之前一直认为只要dispatch的action是同步的(仅仅commit了一个state),就能够当作是同步的函数进行使用
但在看到vuex的源码的dispatch实现的代码就知道其实dispatch实际上是一个异步函数git

dispatch (_type, _payload) {
   ...
    return result.then(res => {
      try {
        this._actionSubscribers
          .filter(sub => sub.after)
          .forEach(sub => sub.after(action, this.state))
      } catch (e) {
        if (process.env.NODE_ENV !== 'production') {
          console.warn(`[vuex] error in after action subscribers: `)
          console.error(e)
        }
      }
      return res
    })
}

代码能够看到dispatch返回的是一个promise,因此它是一个异步函数,因此即便action里面的逻辑是同步的,若是dispatch以后须要接着用到commit的state变量,仍然须要使用异步写法(dispatch().then(()=> {}))来实现。github

  • 注:用同步的写法看起来好像state也是对的,但我认为是由于个人业务场景io使用率不是很高因此"看起来是对的",在高io的场景下state可能会由于延时而没有及时更新

若有错误,请不吝提出,谢谢!vuex

相关文章
相关标签/搜索