详解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 相关文章推荐
测试你的JS的掌握程度的代码
Dec 09 Javascript
js使用函数绑定技术改变事件处理程序的作用域
Dec 26 Javascript
JS+CSS实现鼠标滑过时动态翻滚的导航条效果
Sep 24 Javascript
基于jquery实现图片放大功能
May 07 Javascript
基于jQuery倒计时插件实现团购秒杀效果
May 13 Javascript
js动态生成form 并用ajax方式提交的实现方法
Sep 09 Javascript
Vuejs第十二篇之动态组件全面解析
Sep 09 Javascript
如何处理JSON中的特殊字符
Nov 30 Javascript
bootstrap jquery dataTable 异步ajax刷新表格数据的实现方法
Feb 10 Javascript
React Native 环境搭建的教程
Aug 19 Javascript
推荐10款扩展Web表单的JS插件
Dec 25 Javascript
JavaScript实现更换背景图片
Oct 18 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静态文件返回304技巧分享
2015/01/06 PHP
PHP时间戳格式全部汇总 (获取时间、时间戳)
2016/06/13 PHP
php字符串操作常见问题小结
2016/10/11 PHP
php使用preg_match()函数验证ip地址的方法
2017/01/07 PHP
PHP中soap用法示例【SoapServer服务端与SoapClient客户端编写】
2018/12/25 PHP
php数组函数array_push()、array_pop()及array_shift()简单用法示例
2020/01/26 PHP
yii框架结合charjs实现统计30天数据的方法
2020/04/04 PHP
Thinkphp框架使用list_to_tree 实现无限级分类列出所有节点示例
2020/04/04 PHP
7个Javascript地图脚本整理
2009/10/20 Javascript
JS实现动态表格的添加,修改,删除功能(推荐)
2016/06/15 Javascript
js精准的倒计时函数分享
2016/06/29 Javascript
简单实现node.js图片上传
2016/12/18 Javascript
如何利用JQuery实现从底部回到顶部的功能
2016/12/27 Javascript
Ajax实现不刷新取最新商品
2017/03/01 Javascript
纯JS实现只能输入数字的简单代码
2017/06/21 Javascript
最基础的vue.js双向绑定操作
2017/08/23 Javascript
vue与vue-i18n结合实现后台数据的多语言切换方法
2018/03/08 Javascript
浅谈一个webpack构建速度优化误区
2019/06/24 Javascript
微信小程序学习之自定义滚动弹窗
2020/12/20 Javascript
[00:44]2016完美“圣”典 风云人物:Mikasa宣传片
2016/12/07 DOTA
[51:00]Secret vs VGJ.S 2018国际邀请赛淘汰赛BO3 第一场 8.24
2018/08/25 DOTA
Python使用cx_Freeze库生成msi格式安装文件的方法
2018/07/10 Python
Python 操作 ElasticSearch的完整代码
2019/08/04 Python
Django将默认的SQLite更换为MySQL的实现
2019/11/18 Python
解决python gdal投影坐标系转换的问题
2020/01/17 Python
python如何遍历指定路径下所有文件(按按照时间区间检索)
2020/09/14 Python
python爬取豆瓣电影排行榜(requests)的示例代码
2021/02/18 Python
全球知名的珠宝首饰品牌:Kay Jewelers
2018/02/11 全球购物
网上书店创业计划书
2014/01/12 职场文书
2014道德模范事迹材料
2014/02/16 职场文书
初三开学计划书
2014/04/27 职场文书
开票员岗位职责
2015/02/12 职场文书
2015秋季幼儿园开学通知
2015/07/16 职场文书
2015年办税服务厅工作总结
2015/07/23 职场文书
小学语文国培研修日志
2015/11/13 职场文书
springcloud之Feign超时问题的解决
2021/06/24 Java/Android