详解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 相关文章推荐
动态加载js和css(外部文件)
Apr 17 Javascript
JS 修改URL参数(实现代码)
Jul 08 Javascript
Node.js如何自动审核团队的代码
Jul 20 Javascript
浅谈jQuery为哪般去掉了浏览器检测
Aug 29 Javascript
利用JS判断字符串是否含有数字与特殊字符的方法小结
Nov 25 Javascript
常用JS图片滚动(无缝、平滑、上下左右滚动)代码大全(推荐)
Dec 20 Javascript
原生js实现无限循环轮播图效果
Jan 20 Javascript
用vue快速开发app的脚手架工具
Jun 11 Javascript
微信jssdk踩坑之签名错误invalid signature
May 19 Javascript
React实现轮播效果
Aug 25 Javascript
如何基于viewport vm适配移动端页面
Nov 13 Javascript
Node与Python 双向通信的实现代码
Jul 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 $_SERVER当前完整url的写法
2009/11/12 PHP
PHP+ACCESS 文章管理程序代码
2010/06/21 PHP
PHP中time(),date(),mktime()区别介绍
2013/09/28 PHP
php实现构建排除当前元素的乘积数组方法
2018/10/06 PHP
jQuery提交表单ajax查询实例代码
2012/10/07 Javascript
THREE.JS入门教程(3)着色器-下
2013/01/24 Javascript
ExtJS4 动态生成的grid导出为excel示例
2014/05/02 Javascript
AngularJS入门教程(一):静态模板
2014/12/06 Javascript
Javascript中获取对象的原型对象的方法小结
2015/02/25 Javascript
浅析AngularJS中的生命周期和延迟处理
2015/06/18 Javascript
jQuery实现下拉菜单(内容为时间)的实时更新及图表的随动更新的方法
2016/07/07 Javascript
jQuery双向列表选择器select版
2016/11/01 Javascript
JavaScript实现简单生成随机颜色的方法
2017/09/21 Javascript
Vue组件和Route的生命周期实例详解
2018/02/10 Javascript
详解webpack 打包文件体积过大解决方案(code splitting)
2018/04/10 Javascript
优化Vue项目编译文件大小的方法步骤
2019/05/27 Javascript
Element Popover 弹出框的使用示例
2020/07/26 Javascript
[48:31]完美世界DOTA2联赛PWL S3 DLG vs Phoenix 第二场 12.17
2020/12/19 DOTA
Python检测生僻字的实现方法
2016/10/23 Python
Python基于回溯法子集树模板解决马踏棋盘问题示例
2017/09/11 Python
如何用OpenCV -python3实现视频物体追踪
2019/12/04 Python
详解用Python爬虫获取百度企业信用中企业基本信息
2020/07/02 Python
Jupyter Notebook添加代码自动补全功能的实现
2021/01/07 Python
基于HTML5 Canvas 实现弹出框效果
2017/06/05 HTML / CSS
基于 HTML5 WebGL 实现的医疗物流系统
2019/10/08 HTML / CSS
Melissa鞋马来西亚官方网站:MDreams马来西亚
2018/04/05 全球购物
马来西亚和新加坡巴士票在线预订:CatchThatBus
2018/11/17 全球购物
美国最大最全的亚洲购物网站:美国亚米网(Yamibuy)
2020/05/05 全球购物
HttpServlet类中的主要方法都有哪些?各自的作用是什么?
2014/03/16 面试题
迷你西餐厅创业计划书范文
2013/12/31 职场文书
大学活动策划书范文
2014/01/10 职场文书
捐书寄语赠言
2014/01/18 职场文书
国际经济与贸易专业大学生职业规划书
2014/03/01 职场文书
岗位工作说明书
2014/07/29 职场文书
法院干警四风问题个人对照检查材料思想汇报
2014/10/07 职场文书
python中使用redis用法详解
2022/12/24 Redis