详解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 相关文章推荐
javascript的函数
Jan 31 Javascript
IE下js调试工具Companion.JS
Oct 15 Javascript
让浏览器非阻塞加载javascript的几种方法小结
Apr 25 Javascript
ExtJS如何设置与获取radio控件的选取状态
Jan 22 Javascript
网页中JS函数自动执行常用三种方法
Mar 30 Javascript
jQuery插件EasyUI设置datagrid的checkbox为禁用状态的方法
Aug 05 Javascript
Vue服务端渲染和Vue浏览器端渲染的性能对比(实例PK )
Mar 31 Javascript
Layui数据表格之获取表格中所有的数据方法
Aug 20 Javascript
对vue事件的延迟执行实例讲解
Aug 28 Javascript
JavaScript基于遍历操作实现对象深拷贝功能示例
Mar 05 Javascript
微信小程序 多行文本显示...+显示更多按钮和收起更多按钮功能
Sep 26 Javascript
vue quill editor 使用富文本添加上传音频功能
Jan 14 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
Smarty模板快速入门
2007/01/04 PHP
php过滤危险html代码
2008/08/18 PHP
PHP中使用crypt()实现用户身份验证的代码
2012/09/05 PHP
thinkphp控制器调度使用示例
2014/02/24 PHP
php使用GeoIP库实例
2014/06/27 PHP
php中memcache 基本操作实例
2015/05/17 PHP
php实现求相对时间函数
2015/06/15 PHP
php设计模式之抽象工厂模式分析【星际争霸游戏案例】
2020/01/23 PHP
通过MSXML2自动获取QQ个人头像及在线情况(给初学者)
2007/01/22 Javascript
js 动态文字滚动的例子
2011/01/17 Javascript
JS控件的生命周期介绍
2012/10/22 Javascript
利用JQuery和JS实现奇偶行背景颜色自定义效果
2012/11/19 Javascript
jQuery提交多个表单的小技巧
2014/07/27 Javascript
JQuery导航菜单选择特效
2016/04/11 Javascript
js轮盘抽奖实例分析
2020/04/17 Javascript
DataTables+BootStrap组合使用Ajax来获取数据并且动态加载dom的方法(排序,过滤,分页等)
2016/11/09 Javascript
JS沙箱模式实例分析
2017/09/04 Javascript
利用adb shell和node.js实现抖音自动抢红包功能(推荐)
2018/02/22 Javascript
vue-better-scroll 的使用实例代码详解
2018/12/03 Javascript
微信小程序自定义可滑动顶部TabBar选项卡实现页面切换功能示例
2019/05/14 Javascript
JS实现简单的表格增删
2020/01/16 Javascript
vue cli4.0项目引入typescript的方法
2020/07/17 Javascript
[03:03]2014DOTA2西雅图国际邀请赛 Alliance战队巡礼
2014/07/07 DOTA
简单了解Django应用app及分布式路由
2019/07/24 Python
django框架auth模块用法实例详解
2019/12/10 Python
Pytorch之卷积层的使用详解
2019/12/31 Python
HTML5自定义属性的问题分析
2019/08/16 HTML / CSS
里程积分管理买卖交换平台:Points.com
2017/01/13 全球购物
Pure Collection美国官网:来自英国羊绒专家的奢华羊绒
2017/11/19 全球购物
Servlet如何得到服务器的信息
2015/12/22 面试题
3D空间设计学生找工作的自我评价
2013/10/28 职场文书
测绘工程个人的自我评价
2013/11/23 职场文书
财务管理专业自荐信范文
2013/12/24 职场文书
人事任命通知
2015/04/20 职场文书
工作态度怎么写
2015/06/25 职场文书
2016年青少年禁毒宣传教育活动总结(学校)
2016/04/05 职场文书