详解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学习笔记 操作jQuery对象 CSS处理
Sep 19 Javascript
JS Replace 全部替换字符的用法小结
Dec 24 Javascript
使用jQuery获得内容以及内容的属性
Feb 26 Javascript
jquery右下角自动弹出可关闭的广告层
May 08 Javascript
js闭包用法实例详解
Dec 13 Javascript
利用node.js实现反向代理的方法详解
Jul 24 Javascript
React-Native使用Mobx实现购物车功能
Sep 14 Javascript
Vue 按键修饰符处理事件的方法
May 04 Javascript
vue中使用echarts制作圆环图的实例代码
Jul 27 Javascript
微信小程序实现简易table表格
Jun 19 Javascript
vue 移动端记录页面浏览位置的方法
Mar 11 Javascript
适合后台管理系统开发的12个前端框架(小结)
Jun 29 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网站地图生成类示例
2014/01/13 PHP
Mac版PhpStorm之XAMPP整合apache服务器配置的图文教程详解
2016/10/13 PHP
Laravle eloquent 多对多模型关联实例详解
2017/11/22 PHP
CI框架教程之优化验证码机制详解【验证码辅助函数】
2019/04/16 PHP
php+iframe 实现上传文件功能示例
2020/03/04 PHP
xml分页+ajax请求数据源+dom取结果实例代码
2008/10/31 Javascript
Javascript UrlDecode函数代码
2010/01/09 Javascript
javascript实用小函数使用介绍
2013/11/11 Javascript
jQuery隐藏和显示效果实现
2016/04/06 Javascript
基于JS实现横线提示输入验证码随验证码输入消失(js验证码的实现)
2016/10/27 Javascript
jQuery+SpringMVC中的复选框选择与传值实例
2018/01/08 jQuery
vue.js项目 el-input 组件 监听回车键实现搜索功能示例
2018/08/25 Javascript
Node.js如何优雅的封装一个实用函数的npm包的方法
2019/04/29 Javascript
JavaScript页面倒计时功能完整示例
2019/05/15 Javascript
使用JS判断页面是首次被加载还是刷新
2019/05/26 Javascript
使用layui的router来进行传参的实现方法
2019/09/06 Javascript
微信小程序商品详情页底部弹出框
2019/11/22 Javascript
Python的ORM框架SQLObject入门实例
2014/04/28 Python
Python中index()和seek()的用法(详解)
2017/04/27 Python
python pycurl验证basic和digest认证的方法
2018/05/02 Python
替换python字典中的key值方法
2018/07/06 Python
详谈Python 窗体(tkinter)表格数据(Treeview)
2018/10/11 Python
python并发编程多进程之守护进程原理解析
2019/08/20 Python
python GUI库图形界面开发之PyQt5中QMainWindow, QWidget以及QDialog的区别和选择
2020/02/26 Python
Python wordcloud库安装方法总结
2020/12/31 Python
HTML5中indexedDB 数据库的使用实例
2017/05/11 HTML / CSS
Martinelli官方商店:西班牙皮鞋和高跟鞋品牌
2019/07/30 全球购物
计算机应用专业应届毕业生中文求职信范文
2013/11/29 职场文书
统计岗位职责
2014/02/21 职场文书
乡镇党员干部四风对照检查材料思想汇报
2014/09/27 职场文书
2014院党委领导班子及其成员群众路线对照检查材料思想汇报
2014/10/04 职场文书
丧事答谢词
2015/01/05 职场文书
授权委托书
2015/01/28 职场文书
小学感恩节活动总结
2015/03/24 职场文书
Nginx内网单机反向代理的实现
2021/11/07 Servers
移除Selenium中window.navigator.webdriver值
2022/06/10 Python