详解vuex中action何时完成以及如何正确调用dispatch的思考


Posted in Javascript onJanuary 21, 2019

在项目中遇到关于action与dispatch使用的一些细节问题,经过搜索得到了一些答案。

特意在此提出,如有错误还请指出,十分感谢~

问题1:如果action是异步的,那么怎么知道它什么时候完成?在vuex的官网给出了答案:

详解vuex中action何时完成以及如何正确调用dispatch的思考

注:如果需要通过组合多个action来完成某些逻辑,用async/await会更简单一点

问题2: 如果action是同步的,就不需要等待它完成了吗?

其实这个问题相当于在w:dispatch('some action')是一个同步函数还是异步函数。

如果dispatch是一个异步函数(返回一个promise),那么即使action里面的逻辑是同步的,如果需要等待这个action完成之后才进行某些操作,仍然是需要用异步等待dispatch().then(()=> {})来实现

通过查看vuex的源码找到了答案:

dispatch (_type, _payload) {
  // check object-style dispatch
  const {
   type,
   payload
  } = unifyObjectStyle(_type, _payload)

  const action = { type, payload }
  const entry = this._actions[type]
  if (!entry) {
   if (process.env.NODE_ENV !== 'production') {
    console.error(`[vuex] unknown action type: ${type}`)
   }
   return
  }

  try {
   this._actionSubscribers
    .filter(sub => sub.before)
    .forEach(sub => sub.before(action, this.state))
  } catch (e) {
   if (process.env.NODE_ENV !== 'production') {
    console.warn(`[vuex] error in before action subscribers: `)
    console.error(e)
   }
  }

  const result = entry.length > 1
   ? Promise.all(entry.map(handler => handler(payload)))
   : entry[0](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,所以dispatch后如果需要跟进操作(比如dispatch里面commit了一个state,后续要用到这个state),正确的做法应该是需要用异步的方式来完成后续的逻辑

注:用同步的写法看起来好像state也是对的,但可能只是恰好我的业务场景io使用不是很高所以"看起来是对的",严谨的做法应该还是需要用异步来完成后续操作的

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
经常用到的JavasScript事件的翻译
Apr 09 Javascript
JQuery实现用户名无刷新验证的小例子
Mar 22 Javascript
原生JS实现加入收藏夹的代码
Oct 24 Javascript
js数组常见操作及数组与字符串相互转化实例详解
Nov 10 Javascript
原生js编写autoComplete插件
Apr 13 Javascript
浅谈JS继承_借用构造函数 & 组合式继承
Aug 16 Javascript
thinkphp标签实现bootsrtap轮播carousel实例代码
Feb 19 Javascript
js/jq仿window文件夹移动/剪切/复制等操作代码
Mar 08 Javascript
vue2.0 根据状态值进行样式的改变展示方法
Mar 13 Javascript
基于three.js实现的3D粒子动效实例代码
Apr 09 Javascript
vue前端框架—Mint UI详解(更适用于移动端)
Apr 30 Javascript
ionic+html5+API实现双击返回键退出应用
Sep 17 Javascript
JavaScript常用事件介绍
Jan 21 #Javascript
JavaScript使用闭包模仿块级作用域操作示例
Jan 21 #Javascript
JavaScript闭包与作用域链实例分析
Jan 21 #Javascript
js中事件对象和事件委托的介绍
Jan 21 #Javascript
JavaScript作用域链实例详解
Jan 21 #Javascript
Jquery的Ajax技术使用方法
Jan 21 #jQuery
js变量声明var使用与不使用的区别详解
Jan 21 #Javascript
You might like
我的论坛源代码(四)
2006/10/09 PHP
新安装的MySQL数据库需要注意的安全知识
2008/07/30 PHP
一道关于php变量引用的面试题
2010/08/08 PHP
基于jquery的合并table相同单元格的插件(精简版)
2011/04/05 Javascript
javascript 闭包
2011/09/15 Javascript
可自己添加html的伪弹出框实现代码
2013/09/08 Javascript
JavaScript禁止页面操作的示例代码
2013/12/17 Javascript
浅谈页面装载js及性能分析方法
2014/12/09 Javascript
JavaScript实现非常简单实用的下拉菜单效果
2015/08/27 Javascript
JS+JSP通过img标签调用实现静态页面访问次数统计的方法
2015/12/14 Javascript
JavaScript原生对象常用方法总结(推荐)
2016/05/13 Javascript
jQuery操作dom实现弹出页面遮罩层(web端和移动端阻止遮罩层的滑动)
2016/08/25 Javascript
详解Js模板引擎(TrimPath)
2016/11/22 Javascript
详解webpack + react + react-router 如何实现懒加载
2017/11/20 Javascript
微信 jssdk 签名错误invalid signature的解决方法
2019/01/14 Javascript
使用Vue.js中的过滤器实现幂方求值的方法
2019/08/27 Javascript
小程序如何自主实现拦截器的示例代码
2019/11/04 Javascript
bootstrap-paginator服务器端分页使用方法详解
2020/02/13 Javascript
Vue使用自定义指令实现拖拽行为实例分析
2020/06/06 Javascript
vue3.0 自适应不同分辨率电脑的操作
2021/02/06 Vue.js
手动实现vue2.0的双向数据绑定原理详解
2021/02/06 Vue.js
[02:29]完美世界高校联赛上海赛区回顾
2015/12/15 DOTA
python将图片文件转换成base64编码的方法
2015/03/14 Python
pytorch实现MNIST手写体识别
2020/02/14 Python
python des,aes,rsa加解密的实现
2021/01/16 Python
利用Python如何画一颗心、小人发射爱心
2021/02/21 Python
CSS3教程(4):网页边框和网页文字阴影
2009/04/02 HTML / CSS
Html5写一个简单的俄罗斯方块小游戏
2019/12/03 HTML / CSS
美体小铺法国官方网站:The Body Shop法国
2020/06/04 全球购物
请说出你所知道的线程同步的方法
2013/04/19 面试题
请用Java实现列出某个目录下的所有文件
2013/09/23 面试题
J2EE中的容器都包括哪些
2013/08/21 面试题
少先队学雷锋活动总结范文
2014/03/09 职场文书
电大毕业个人生自我鉴定
2014/03/26 职场文书
军训口号
2014/06/13 职场文书
临床医学专业求职信
2014/08/08 职场文书