详解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 相关文章推荐
script不刷新页面的联动前后代码
Sep 18 Javascript
js怎么覆盖原有方法实现重写
Sep 04 Javascript
jQuery实现视频作为全屏幕背景
Dec 18 Javascript
angularJS 入门基础
Feb 09 Javascript
基于jQuey实现鼠标滑过变色(整行变色)
Dec 07 Javascript
JavaScript 实现的 zip 压缩和解压缩工具包Zip.js使用详解
Dec 14 Javascript
图解Sublime Text3使用技巧
Dec 21 Javascript
JS简单获取及显示当前时间的方法
Aug 03 Javascript
微信小程序城市定位的实现实例(获取当前所在国家城市信息)
May 17 Javascript
jquery实现图片跟随鼠标的实例
Oct 17 jQuery
vue实现仿淘宝结账页面实例代码
Nov 08 Javascript
vue 中基于html5 drag drap的拖放效果案例分析
Nov 01 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实现用户注册登录功能
2016/10/14 PHP
PHP 自动加载类原理与用法实例分析
2020/04/14 PHP
HTML中事件触发列表与解说
2007/07/09 Javascript
js 获取子节点函数 (兼容FF与IE)
2010/04/18 Javascript
基于jquery的DIV随滚动条滚动而滚动的代码
2012/07/20 Javascript
分享javascript实现的冒泡排序代码并优化
2016/06/05 Javascript
玩转Koa之核心原理分析
2018/12/29 Javascript
Layui给switch添加响应事件的例子
2019/09/03 Javascript
layer实现登录弹框,登录成功后关闭弹框并调用父窗口的例子
2019/09/11 Javascript
webpack常用配置总览(小结)
2019/11/18 Javascript
原生JS实现贪吃蛇小游戏
2020/03/09 Javascript
JS+css3实现幻灯片轮播图
2020/08/14 Javascript
Python实现分割文件及合并文件的方法
2015/07/10 Python
Python的math模块中的常用数学函数整理
2016/02/04 Python
Python发送form-data请求及拼接form-data内容的方法
2016/03/05 Python
Bottle框架中的装饰器类和描述符应用详解
2017/10/28 Python
python2爬取百度贴吧指定关键字和图片代码实例
2019/08/14 Python
Python 私有化操作实例分析
2019/11/21 Python
python匿名函数lambda原理及实例解析
2020/02/07 Python
python数据爬下来保存的位置
2020/02/17 Python
Python批量启动多线程代码实例
2020/02/18 Python
拉斯维加斯城市观光通行证:Las Vegas Pass
2019/05/21 全球购物
财务分析个人的自荐书范文
2013/11/24 职场文书
关于母亲节的感言
2014/02/04 职场文书
销售总经理岗位职责
2014/03/15 职场文书
酒店总经理岗位职责
2014/03/17 职场文书
伊索寓言教学反思
2014/05/01 职场文书
大学新生军训方案
2014/05/03 职场文书
低碳生活的宣传标语
2014/06/23 职场文书
语文教师个人工作总结
2015/02/06 职场文书
工作态度怎么写
2015/06/25 职场文书
学校运动会加油词
2015/07/18 职场文书
村官2015年度工作总结
2015/10/14 职场文书
大学生奶茶店创业计划书
2019/06/25 职场文书
python基于OpenCV模板匹配识别图片中的数字
2021/03/31 Python
oracle通过存储过程上传list保存功能
2021/05/12 Oracle