为什么等待后异步功能继续(在vuex中)

时间:2018-02-06 14:51:09

标签: javascript vue.js promise async-await vuex

从一个vuex操作(togglePostLike)我尝试使用async / await等待另一个vuex操作(requiresAuth)。

我曾预料到如果return Promise.resolve()从未被调用过,那么第一个动作应该在await dispatch处停止(并收集垃圾),但即使没有解决方案,也会进入console.log('this is called SECOND')

难道没有决心等待停止执行吗?我怎样才能达到预期的行为?

/store/modules/post.js

async togglePostLike ({ dispatch, rootState }, post) {
    await dispatch('user/requiresAuth', null, { root: true })
    console.log('this is called SECOND, but why without resolve')
    // I don't want this stuff to execute without the resolve
    if (post.likes.includes(rootState.user._id)) {
      dispatch('addPostUnlike', post)
    } else {
      dispatch('addPostLike', post)
    }
},

/store/modules/user.js

async requiresAuth ({ state }) {
      if (!state.authenticated) {
         router.push({ name: 'login', query: { comeBack: true } })
         $(`.modal`).modal('hide')
         console.log('this is called first')
       } else {
         console.log('this is NOT called')
         return Promise.resolve()
       }
  },

编辑:如果没有async / await,它的外观

据我所知vuex docsdispatch无论如何都会返回一个承诺。使用以下内容:

post.js

if (dispatch('user/requiresAuth', null, { root: true })) {
     // still executes before return false   
}

user.js的

requiresAuth ({ state }) {
  if (!state.authenticated) {
     // do stuff (does it)
     return false
   }
   return true
}

1 个答案:

答案 0 :(得分:4)

async function这样的requiresAuth总是返回一个使用返回值解析的promise(如果没有评估undefined语句,则包括return)。函数是否在没有returnreturn;return undefined;return Promise.resolve()return Promise.resolve(undefined)的情况下结束没有区别它们与外界无法区分。

返回一个布尔值然后对其进行分支,或者只是抛出异常。