Javascript 为什么异步函数在等待后继续(在vuex中)
从一个vuex操作(Javascript 为什么异步函数在等待后继续(在vuex中),javascript,vue.js,promise,async-await,vuex,Javascript,Vue.js,Promise,Async Await,Vuex,从一个vuex操作(togglePostLike)开始,我正在尝试使用async/await等待另一个vuex操作(requireAuth) 我原以为,如果从未调用过return Promise.resolve(),那么第一个操作应该在等待分派时停止(并获取垃圾回收),但即使没有解析,它也会进入控制台.log('称为SECOND') 难道等待不应该停止执行而没有决心吗?我怎样才能达到预期的行为 /store/modules/post.js async togglePostLike ({ disp
togglePostLike
)开始,我正在尝试使用async/await等待另一个vuex操作(requireAuth
)
我原以为,如果从未调用过return Promise.resolve()
,那么第一个操作应该在等待分派时停止(并获取垃圾回收),但即使没有解析,它也会进入控制台.log('称为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)
}
},
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()
}
},
if (dispatch('user/requiresAuth', null, { root: true })) {
// still executes before return false
}
requiresAuth ({ state }) {
if (!state.authenticated) {
// do stuff (does it)
return false
}
return true
}
/store/modules/user.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)
}
},
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()
}
},
if (dispatch('user/requiresAuth', null, { root: true })) {
// still executes before return false
}
requiresAuth ({ state }) {
if (!state.authenticated) {
// do stuff (does it)
return false
}
return true
}
编辑:没有异步/等待时的外观
据我所知,dispatch
无论如何都会返回一个承诺。使用以下命令:
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)
}
},
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()
}
},
if (dispatch('user/requiresAuth', null, { root: true })) {
// still executes before return false
}
requiresAuth ({ state }) {
if (!state.authenticated) {
// do stuff (does it)
return false
}
return true
}
user.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)
}
},
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()
}
},
if (dispatch('user/requiresAuth', null, { root: true })) {
// still executes before return false
}
requiresAuth ({ state }) {
if (!state.authenticated) {
// do stuff (does it)
return false
}
return true
}
async函数
如requireauth
总是返回一个用返回值解析的承诺(如果未计算return
语句,则包括undefined
)。函数结束时是否没有返回
,返回没有区别
,返回未定义的代码>,带有返回承诺.resolve()
或返回承诺.resolve(未定义)
-它们与外部无法区分
返回一个布尔值,然后对其进行分支,或者只是抛出一个异常。像requireauth
这样的异步函数总是返回一个用返回值解析的承诺(如果未计算return
语句,则包括未定义的)。函数结束时是否没有返回
,返回没有区别
,返回未定义的代码>,带有返回承诺.resolve()
或返回承诺.resolve(未定义)
-它们与外部无法区分
要么返回一个布尔值,然后对其进行分支,要么抛出一个异常。为什么在这里使用async
/wait
?您的代码中没有异步内容。@Bergi,因为dispatch仍然返回异步。因此,例如,当您取出async,并尝试在条件中返回false
时,它将继续进行,但requireAuth
不使用分派
?另外,要在togglePostLike
中等待分派
调用,您需要返回
或等待
结果。我阅读vuex操作文档的方式,我一直认为,除非显式返回承诺,或者除非操作方法是async
,否则操作不会返回承诺。但是,我发现这不是真的。所以,你的假设是正确的<代码>分派('user/requiresAuth',…)。然后(result=>if(result){//do stuff})
应该可以在您编辑的示例中使用@谢谢是的,我最终采取的方法就是你刚才写的方法。Vuex docs确实有一个带有显式返回承诺的分派示例,因此我仍然不清楚其中是否存在差异,但我可能需要了解更多关于承诺、承诺等的信息。您在这里使用的是async
/wait
?您的代码中没有异步内容。@Bergi,因为dispatch仍然返回异步。因此,例如,当您取出async,并尝试在条件中返回false
时,它将继续进行,但requireAuth
不使用分派
?另外,要在togglePostLike
中等待分派
调用,您需要返回
或等待
结果。我阅读vuex操作文档的方式,我一直认为,除非显式返回承诺,或者除非操作方法是async
,否则操作不会返回承诺。但是,我发现这不是真的。所以,你的假设是正确的<代码>分派('user/requiresAuth',…)。然后(result=>if(result){//do stuff})
应该可以在您编辑的示例中使用@谢谢是的,我最终采取的方法就是你刚才写的方法。Vuex docs确实有一个带有显式返回承诺的分派示例,因此我仍然对其中是否存在差异感到困惑,但我可能需要进一步了解承诺、标签等。我认为,造成困惑的根本原因是Vuexdispatch
方法(显然)总是会返回承诺,即使正在调度的方法不是异步的
。是的,您需要如果(等待调度(…)
我认为,这里混乱的根本原因是Vuex调度
方法(显然)总是会返回一个承诺
,即使正在调度的方法不是异步的
。是的,您需要if(等待分派(…)