详解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 相关文章推荐
jQuery中(function(){})()执行顺序的理解
Mar 05 Javascript
Javascript设置对象的ReadOnly属性(示例代码)
Dec 25 Javascript
js 触发select onchange事件代码
Mar 20 Javascript
javascript实现随时变化着的背景颜色
Apr 02 Javascript
jQuery-1.9.1源码分析系列(十)事件系统之事件包装
Nov 20 Javascript
Javascript在IE和Firefox浏览器常见兼容性问题总结
Aug 03 Javascript
基于vue cli重构多页面脚手架过程详解
Jan 23 Javascript
微信小程序实现自定义加载图标功能
Jul 19 Javascript
CountUp.js实现数字滚动增值效果
Oct 17 Javascript
Js实现复选框的全选、全不选反选功能代码实例
Feb 28 Javascript
jquery实现上传图片功能
Jun 29 jQuery
vue3.0自定义指令(drectives)知识点总结
Dec 27 Vue.js
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
解析zend studio中直接导入svn中的项目的方法步骤
2013/06/21 PHP
php实现检查文章是否被百度收录
2015/01/27 PHP
Yii实现简单分页的方法
2016/04/29 PHP
详解Yii2 rules 的验证规则
2016/12/02 PHP
PHP CURL采集百度搜寻结果图片不显示问题的解决方法
2017/02/03 PHP
PHP单元测试配置与使用方法详解
2019/12/27 PHP
《JavaScript高级程序设计》阅读笔记(二) ECMAScript中的原始类型
2012/02/27 Javascript
JS获取浏览器版本及名称实现函数
2013/04/02 Javascript
Jquery下EasyUI组件中的DataGrid结果集清空方法
2014/01/06 Javascript
jquery教程限制文本框只能输入数字和小数点示例分享
2014/01/13 Javascript
jquery跟js初始化加载的多种方法及区别介绍
2014/04/02 Javascript
jQuery/CSS3图片特效插件整理推荐
2014/12/07 Javascript
javascript框架设计之种子模块
2015/06/23 Javascript
Javascript实现可旋转的圆圈实例代码
2015/08/04 Javascript
jQuery多级联动下拉插件chained用法示例
2016/08/20 Javascript
JS实现弹出下载对话框及常见文件类型的下载
2017/07/13 Javascript
深入理解vuex2.0 之 modules
2017/11/20 Javascript
vue下history模式刷新后404错误解决方法
2018/08/18 Javascript
vee-validate vue 2.0自定义表单验证的实例
2018/08/28 Javascript
element-ui多文件上传的实现示例
2019/04/10 Javascript
微信内置开发 iOS修改键盘换行为搜索的解决方案
2019/11/06 Javascript
Python 解析XML文件
2009/04/15 Python
Python enumerate索引迭代代码解析
2018/01/19 Python
Python实现将数据写入netCDF4中的方法示例
2018/08/30 Python
pygame游戏之旅 添加游戏界面按键图形
2018/11/20 Python
Python第三方Window模块文件的几种安装方法
2018/11/22 Python
利用pytorch实现对CIFAR-10数据集的分类
2020/01/14 Python
Python Tkinter Entry和Text的添加与使用详解
2020/03/04 Python
Python logging模块进行封装实现原理解析
2020/08/07 Python
html5 拖拽及用 js 实现拖拽功能的示例代码
2020/10/23 HTML / CSS
意大利奢侈品零售商:ilDuomo Novara
2019/09/11 全球购物
bonprix荷兰网上商店:便宜的服装、鞋子和家居用品
2020/07/04 全球购物
SOA的常见陷阱或者误解是什么
2014/10/05 面试题
作弊检讨书
2015/01/27 职场文书
2015年信息技术教研组工作总结
2015/07/22 职场文书
CentOS安装Nginx并部署vue
2022/04/12 Servers