详解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系列之数值计算
Jun 07 Javascript
jQuery学习笔记之jQuery.extend(),jQuery.fn.extend()分析
Jun 09 Javascript
深入理解JavaScript系列(49):Function模式(上篇)
Mar 04 Javascript
JS非Alert实现网页右下角“未读信息”效果弹窗
Sep 26 Javascript
微信小程序 生命周期和页面的生命周期详细介绍
Jan 19 Javascript
html5 canvas 详细使用教程
Jan 20 Javascript
checkbox:click事件触发span元素内容改变的方法
Sep 11 Javascript
jQuery实现弹窗下底部页面禁止滑动效果
Dec 19 jQuery
解决angularjs前后端分离调用接口传递中文时中文乱码的问题
Aug 13 Javascript
vue+elementUI实现表单和图片上传及验证功能示例
May 14 Javascript
js实现点击图片在屏幕中间弹出放大效果
Sep 11 Javascript
Vue实现点击导航栏当前标签后变色功能
Aug 19 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读取目录下所有文件的代码
2008/01/07 PHP
php注册登录系统简化版
2020/12/28 PHP
multiSteps 基于Jquery的多步骤滑动切换插件
2011/07/22 Javascript
JavaScript高级程序设计(第3版)学习笔记2 js基础语法
2012/10/11 Javascript
关于div自适应高度/左右高度自适应一致的js代码
2013/03/22 Javascript
深入理解JavaScript编程中的同步与异步机制
2015/06/24 Javascript
微信小程序 wx.request(object) API详解及实例代码
2016/09/30 Javascript
javascript滚轮事件基础实例讲解(37)
2017/02/14 Javascript
原生JS仿QQ阅读点击展开、收起效果
2017/03/08 Javascript
vue vue-Router默认hash模式修改为history需要做的修改详解
2018/09/13 Javascript
详解如何用VUE写一个多用模态框组件模版
2018/09/27 Javascript
使用webpack搭建vue项目及注意事项
2019/06/10 Javascript
js实现录音上传功能
2019/11/22 Javascript
Python实现多行注释的另类方法
2014/08/22 Python
python将ip地址转换成整数的方法
2015/03/17 Python
Python文件操作,open读写文件,追加文本内容实例
2016/12/14 Python
Python 通配符删除文件的实例
2018/04/24 Python
Python实现重建二叉树的三种方法详解
2018/06/23 Python
解决pycharm工程启动卡住没反应的问题
2019/01/19 Python
Python中使用双下划线防止类属性被覆盖问题
2019/06/27 Python
Python及Pycharm安装方法图文教程
2019/08/05 Python
python输出数组中指定元素的所有索引示例
2019/12/06 Python
Django中的模型类设计及展示示例详解
2020/05/29 Python
python 在sql语句中使用%s,%d,%f说明
2020/06/06 Python
Html5 实现微信分享及自定义内容的流程
2019/08/20 HTML / CSS
联想马亚西亚官方网站:Lenovo Malaysia
2018/09/19 全球购物
乌克兰数字设备、配件和智能技术的连锁商店:KTC
2020/08/18 全球购物
预备党员党校学习自我评价分享
2013/11/12 职场文书
幼儿园中班下学期评语
2014/04/18 职场文书
关于雷锋的演讲稿
2014/05/10 职场文书
促销活动总结模板
2014/07/01 职场文书
施工安全责任书范本
2014/07/24 职场文书
2014县政府领导班子对照检查材料思想汇报
2014/09/25 职场文书
React Native项目框架搭建的一些心得体会
2021/05/28 Javascript
Python实现简繁体转换
2021/06/07 Python
Java 垃圾回收超详细讲解记忆集和卡表
2022/04/08 Java/Android