详解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 获取表单text,areatext,radio,checkbox,select值的代码
Nov 12 Javascript
jQuery表单验证插件formValidator(改进版)
Feb 03 Javascript
JavaScript显示当然日期和时间即年月日星期和时间
Oct 29 Javascript
Jquery遍历checkbox获取选中项value值的方法
Feb 13 Javascript
Javascript HTML5 Canvas实现的一个画板
Apr 12 Javascript
Javascript typeof与instanceof的区别
Oct 18 Javascript
JS返回只包含数字类型的数组实例分析
Dec 16 Javascript
详解vue服务端渲染浏览器端缓存(keep-alive)
Oct 12 Javascript
layer弹出框确定前验证:弹出消息框的方法(弹出两个layer)
Sep 21 Javascript
JS pushlet XMLAdapter适配器用法案例解析
Oct 16 Javascript
如何通过简单的代码描述Angular父组件、子组件传值
Apr 07 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 mysql 判断update之后是否更新了的方法
2012/01/10 PHP
php 文本文件的读取效率
2012/02/10 PHP
php中的注释、变量、数组、常量、函数应用介绍
2012/11/16 PHP
详解php的socket通信
2015/08/11 PHP
详解PHP的Yii框架中日志的相关配置及使用
2015/12/08 PHP
PHP进阶学习之垃圾回收机制详解
2019/06/18 PHP
JavaScript入门教程(9) Document文档对象
2009/01/31 Javascript
jQuery)扩展jQuery系列之一 模拟alert,confirm(一)
2010/12/04 Javascript
JS操作JSON要领详细总结
2013/08/25 Javascript
JavaScript极简入门教程(三):数组
2014/10/25 Javascript
node.js中的fs.appendFile方法使用说明
2014/12/17 Javascript
JavaSacript中charCodeAt()方法的使用详解
2015/06/05 Javascript
js实现仿京东2级菜单效果(带延时功能)
2015/08/27 Javascript
详解Jquery实现ready和bind事件
2016/04/14 Javascript
vue-router+nginx 非根路径配置方法
2018/06/30 Javascript
vue指令之表单控件绑定v-model v-model与v-bind结合使用
2019/04/17 Javascript
[46:10]2014 DOTA2国际邀请赛中国区预选赛 CnB VS HGT
2014/05/21 DOTA
[01:06:25]Secret vs Liquid 2018国际邀请赛淘汰赛BO3 第一场 8.25
2018/08/29 DOTA
python list中append()与extend()用法分享
2013/03/24 Python
tensorflow学习教程之文本分类详析
2018/08/07 Python
CSS3 Calc实现滚动条出现页面不跳动问题
2017/09/14 HTML / CSS
详解利用canvas实现环形进度条的方法
2019/06/12 HTML / CSS
欧洲最大的化妆品连锁公司:Douglas道格拉斯
2017/05/06 全球购物
Shopee马来西亚:随拍即卖,最佳行动电商拍卖平台
2017/06/05 全球购物
澳大利亚药房在线:ThePharmacy
2017/10/04 全球购物
毕业生个人求职信范例分享
2013/12/17 职场文书
大学生写自荐信的技巧
2014/01/08 职场文书
甜美蛋糕店创业计划书
2014/01/30 职场文书
《花瓣飘香》教学反思
2014/04/15 职场文书
企业理念标语
2014/06/09 职场文书
2014市国税局对照检查材料思想汇报
2014/09/23 职场文书
校长师德师风自我剖析材料
2014/09/29 职场文书
党的群众路线教育实践活动个人整改方案
2014/10/25 职场文书
学校世界艾滋病日宣传活动总结
2015/05/05 职场文书
golang switch语句的灵活写法介绍
2021/05/06 Golang
Python中的np.argmin()和np.argmax()函数用法
2021/06/02 Python