为什么异步函数在 await 之后继续(在 vuex 中)
Why async function continues after await (in vuex)
从一个 vuex 操作 (togglePostLike
) 我正在尝试使用 async/await 等待另一个 vuex 操作 (requiresAuth
)。
我曾预计,如果 return Promise.resolve()
从未被调用,那么第一个操作应该在 await dispatch
处停止(并收集垃圾),但它会继续进行 console.log('this is called SECOND')
即使没有决心。
不应该 await 在没有解决的情况下停止执行吗?我怎样才能得到预期的行为?
/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 docs,dispatch
returns 反正是一个承诺。使用以下内容:
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
}
像 requiresAuth
这样的 async function
总是 return 是一个用 return 值解决的承诺(如果没有 return
,则包括 undefined
语句进行评估)。函数结束时没有 return
、return;
、return undefined;
、return Promise.resolve()
还是 return Promise.resolve(undefined)
都没有区别 -他们从外面无法区分。
要么 return 一个布尔值然后对其进行分支,要么只是抛出一个异常。
从一个 vuex 操作 (togglePostLike
) 我正在尝试使用 async/await 等待另一个 vuex 操作 (requiresAuth
)。
我曾预计,如果 return Promise.resolve()
从未被调用,那么第一个操作应该在 await dispatch
处停止(并收集垃圾),但它会继续进行 console.log('this is called SECOND')
即使没有决心。
不应该 await 在没有解决的情况下停止执行吗?我怎样才能得到预期的行为?
/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 docs,dispatch
returns 反正是一个承诺。使用以下内容:
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
}
像 requiresAuth
这样的 async function
总是 return 是一个用 return 值解决的承诺(如果没有 return
,则包括 undefined
语句进行评估)。函数结束时没有 return
、return;
、return undefined;
、return Promise.resolve()
还是 return Promise.resolve(undefined)
都没有区别 -他们从外面无法区分。
要么 return 一个布尔值然后对其进行分支,要么只是抛出一个异常。