详解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 相关文章推荐
Prototype Class对象学习
Jul 19 Javascript
jquery mobile 移动web(5)
Dec 20 Javascript
让html元素随浏览器的大小自适应垂直居中的实现方法
Oct 12 Javascript
Bootstrop实现多级下拉菜单功能
Nov 24 Javascript
关于Function中的bind()示例详解
Dec 02 Javascript
DWR3 访问WEB元素的两种方法实例详解
Jan 03 Javascript
微信小程序学习(4)-系统配置app.json详解
Jan 12 Javascript
详解vue.js2.0父组件点击触发子组件方法
May 10 Javascript
详解HTML5 使用video标签实现选择摄像头功能
Oct 25 Javascript
vue路由守卫,限制前端页面访问权限的例子
Nov 11 Javascript
vue 动态生成拓扑图的示例
Jan 03 Vue.js
ajax请求前端跨域问题原因及解决方案
Oct 16 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
PHP字符编码问题之GB2312 VS UTF-8解决方法
2011/06/23 PHP
php中日期加减法运算实现代码
2011/12/08 PHP
php cli模式学习(PHP命令行模式)
2013/06/03 PHP
javascript 有趣而诡异的数组
2009/04/06 Javascript
Mootools 1.2教程 滑动效果(Slide)
2009/09/15 Javascript
JavaScript 全角转半角部分
2009/10/28 Javascript
jQuery实战之品牌展示列表效果
2011/04/10 Javascript
jquery插件制作 图片走廊 gallery
2012/08/17 Javascript
JS解析XML实例分析
2015/01/30 Javascript
node.js集成百度UE编辑器
2015/02/05 Javascript
JQuery分屏指示器图片轮换效果实例
2015/05/21 Javascript
基于js实现投票的实例代码
2015/08/04 Javascript
Google 地图类型详解及示例代码
2016/08/06 Javascript
JavaScript每天必学之事件
2016/09/18 Javascript
D3.js实现饼状图的方法详解
2016/09/21 Javascript
详解浏览器渲染页面过程
2017/02/09 Javascript
jQuery获取Table某列的值(推荐)
2017/03/03 Javascript
Vue-Access-Control 前端用户权限控制解决方案
2017/12/01 Javascript
Node.js 如何利用异步提升任务处理速度
2019/01/07 Javascript
Fetch超时设置与终止请求详解
2019/05/18 Javascript
vue实现浏览器全屏展示功能
2019/11/27 Javascript
通过javascript实现扫雷游戏代码实例
2020/02/09 Javascript
[43:35]EG vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python3实现连接SQLite数据库的方法
2014/08/23 Python
浅谈解除装饰器作用(python3新增)
2018/10/15 Python
Python图像处理库PIL中图像格式转换的实现
2020/02/26 Python
python打开文件的方式有哪些
2020/06/29 Python
基于Python实现下载网易音乐代码实例
2020/08/10 Python
移动端解决悬浮层(悬浮header、footer)会遮挡住内容的3种方法
2015/03/27 HTML / CSS
HQhair美国/加拿大:英国化妆品、美容及美发产品商城
2019/04/15 全球购物
限量版运动鞋和街头服饰:TheDrop
2020/09/06 全球购物
工厂厂长的职责
2013/12/12 职场文书
2014年应届大学生毕业自我鉴定
2014/01/31 职场文书
大学毕业自我评价
2014/02/02 职场文书
五年级学生期末评语
2014/12/26 职场文书
Python利用机器学习算法实现垃圾邮件的识别
2021/06/28 Python