详解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 Ajax 全解析
Feb 08 Javascript
突发奇想的一个jquery插件
Nov 19 Javascript
使用JQ来编写最基本的淡入淡出效果附演示动画
Oct 31 Javascript
jQuery实现漂亮实用的商品图片tips提示框效果(无图片箭头+阴影)
Apr 16 Javascript
JavaScript编程中实现对象封装特性的实例讲解
Jun 24 Javascript
jQuery基于函数重载实现自定义Alert函数样式的方法
Jul 27 Javascript
详解AngularJS2 Http服务
Jun 26 Javascript
详解如何使用PM2将Node.js的集群变得更加容易
Nov 15 Javascript
浅谈vue自定义全局组件并通过全局方法 Vue.use() 使用该组件
Dec 07 Javascript
vue车牌号校验和银行校验实战
Jan 23 Javascript
微信小程序城市选择及搜索功能的方法
Mar 22 Javascript
微信小程序8种数据通信的方式小结
Feb 03 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比较运算符的详细介绍
2015/09/29 PHP
PHP微信公众号自动发送红包API
2016/06/01 PHP
PHP格式化显示时间date()函数代码
2018/10/03 PHP
yii2 url重写并隐藏index.php方法
2018/12/10 PHP
php array_chunk()函数用法与注意事项
2019/07/12 PHP
Javascript异步表单提交,图片上传,兼容异步模拟ajax技术
2010/05/10 Javascript
JQuery UI的拖拽功能实现方法小结
2012/03/14 Javascript
JS删除字符串中重复字符方法
2014/03/09 Javascript
JavaScript中双叹号(!!)作用示例介绍
2014/04/10 Javascript
jQuery的cookie插件实现保存用户登陆信息
2014/04/15 Javascript
innerHTML在IE中报错解决方案
2014/12/15 Javascript
javascript实现完美拖拽效果
2015/05/06 Javascript
详解JavaScript对W3C DOM模版的支持情况
2015/06/16 Javascript
jquery Easyui快速开发总结
2015/08/20 Javascript
浅谈JS正则表达式的RegExp对象和括号的使用
2016/07/28 Javascript
jQuery Position方法使用和兼容性
2017/08/23 jQuery
react实现移动端下拉菜单的示例代码
2020/01/16 Javascript
nuxt+axios实现打包后动态修改请求地址的方法
2020/04/22 Javascript
[01:45]亚洲邀请赛互动指南虚拟物品介绍
2015/01/30 DOTA
跟老齐学Python之用Python计算
2014/09/12 Python
Windows 64位下python3安装nltk模块
2018/09/19 Python
对python pandas 画移动平均线的方法详解
2018/11/28 Python
财务管理专业应届毕业生求职信
2013/09/22 职场文书
市场营销专科应届生求职信
2013/11/24 职场文书
会计学个人自荐信模板
2013/12/13 职场文书
实习单位接收函模板
2014/01/10 职场文书
大学校运会广播稿
2014/02/03 职场文书
求职意向书
2014/04/01 职场文书
家长通知书家长评语
2014/04/17 职场文书
班主任师德师风自我剖析材料
2014/10/02 职场文书
先进个人评语大全
2015/01/04 职场文书
家长高考寄语
2015/02/27 职场文书
用python删除文件夹中的重复图片(图片去重)
2021/05/12 Python
Oracle 多表查询基本语法实例
2022/04/18 Oracle
mysql 8.0.27 绿色解压版安装教程及配置方法
2022/04/20 MySQL
Python tensorflow卷积神经Inception V3网络结构
2022/05/06 Python