最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

详解vuex中action何时完成以及如何正确调用dispatch的思考

来源:动视网 责编:小采 时间:2020-11-27 22:01:48
文档

详解vuex中action何时完成以及如何正确调用dispatch的思考

详解vuex中action何时完成以及如何正确调用dispatch的思考:在项目中遇到关于action与dispatch使用的一些细节问题,经过搜索得到了一些答案。 特意在此提出,如有错误还请指出,十分感谢~ 问题1:如果action是异步的,那么怎么知道它什么时候完成?在vuex的官网给出了答案: 注:如果需要通过组合多个action来
推荐度:
导读详解vuex中action何时完成以及如何正确调用dispatch的思考:在项目中遇到关于action与dispatch使用的一些细节问题,经过搜索得到了一些答案。 特意在此提出,如有错误还请指出,十分感谢~ 问题1:如果action是异步的,那么怎么知道它什么时候完成?在vuex的官网给出了答案: 注:如果需要通过组合多个action来


在项目中遇到关于action与dispatch使用的一些细节问题,经过搜索得到了一些答案。

特意在此提出,如有错误还请指出,十分感谢~

问题1:如果action是异步的,那么怎么知道它什么时候完成?在vuex的官网给出了答案:

注:如果需要通过组合多个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使用不是很高所以"看起来是对的",严谨的做法应该还是需要用异步来完成后续操作的

文档

详解vuex中action何时完成以及如何正确调用dispatch的思考

详解vuex中action何时完成以及如何正确调用dispatch的思考:在项目中遇到关于action与dispatch使用的一些细节问题,经过搜索得到了一些答案。 特意在此提出,如有错误还请指出,十分感谢~ 问题1:如果action是异步的,那么怎么知道它什么时候完成?在vuex的官网给出了答案: 注:如果需要通过组合多个action来
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top