详解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 精粹笔记
May 09 Javascript
解决Extjs 4 Panel作为Window组件的子组件时出现双重边框问题
Jan 11 Javascript
jQuery中val()方法用法实例
Dec 25 Javascript
JavaScript事件委托技术实例分析
Feb 06 Javascript
jQuery实现商品活动倒计时
Oct 16 Javascript
JQuery控制图片由中心点逐渐放大效果
Jun 26 Javascript
微信公众号 摇一摇周边功能开发
Dec 08 Javascript
使用puppeteer爬取网站并抓出404无效链接
Dec 20 Javascript
vue实现的下拉框功能示例
Jan 29 Javascript
微信小程序常见页面跳转操作简单示例
May 01 Javascript
JS实现提示效果弹出及延迟隐藏的功能
Aug 26 Javascript
JS实现简单的九宫格抽奖
Jun 28 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安装攻略:常见问题解答(二)
2006/10/09 PHP
AJAX for PHP简单表数据查询实例
2007/01/02 PHP
PHP开发规范手册之PHP代码规范详解
2011/01/13 PHP
解析 thinkphp 框架中的部分方法
2017/05/07 PHP
Laravel框架实现redis集群的方法分析
2017/09/14 PHP
特殊字符、常规符号及其代码对照表
2006/06/26 Javascript
Javascript 读后台cookie代码
2008/09/15 Javascript
js单向链表的具体实现实例
2013/06/21 Javascript
js抽奖实现随机抽奖代码效果
2013/12/02 Javascript
基于JavaScript实现生成名片、链接等二维码
2015/09/20 Javascript
JS简单实现仿百度控制台输出信息效果
2016/09/04 Javascript
微信小程序 setData使用方法及常用错误解决办法
2017/05/11 Javascript
javascript获取图片的top N主色值方法详解
2018/01/26 Javascript
使用node打造自己的命令行工具方法教程
2018/03/26 Javascript
浅谈react性能优化的方法
2018/09/05 Javascript
angularjs的单选框+ng-repeat的实现方法
2018/09/12 Javascript
Python中的装饰器用法详解
2015/01/14 Python
python实现简单中文词频统计示例
2017/11/08 Python
深入理解Python分布式爬虫原理
2017/11/23 Python
Python如何爬取微信公众号文章和评论(基于 Fiddler 抓包分析)
2019/06/28 Python
Python之time模块的时间戳,时间字符串格式化与转换方法(13位时间戳)
2019/08/12 Python
Django连接数据库并实现读写分离过程解析
2019/11/13 Python
动态设置django的model field的默认值操作步骤
2020/03/30 Python
使用OpenCV实现人脸图像卡通化的示例代码
2021/01/15 Python
Vans荷兰官方网站:美国南加州的原创极限运动潮牌
2018/01/23 全球购物
三星法国官方网站:Samsung法国
2019/10/31 全球购物
最新远光软件笔试题面试题内容
2013/11/08 面试题
汽车技术服务与营销专业在籍生自荐信
2013/09/28 职场文书
商业活动邀请函
2014/02/04 职场文书
转让协议书范本
2014/04/15 职场文书
软件项目开发计划书
2014/05/01 职场文书
团队会宣传标语
2014/10/09 职场文书
2014年幼儿园个人工作总结
2014/11/10 职场文书
儿园租房协议书范本
2014/12/02 职场文书
银行招聘自荐信
2015/03/06 职场文书
2015年幼儿园学期工作总结
2015/05/22 职场文书