Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么异步函数在等待后继续(在vuex中)_Javascript_Vue.js_Promise_Async Await_Vuex - Fatal编程技术网

Javascript 为什么异步函数在等待后继续(在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

从一个vuex操作(
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确实有一个带有显式返回承诺的分派示例,因此我仍然对其中是否存在差异感到困惑,但我可能需要进一步了解承诺、标签等。我认为,造成困惑的根本原因是Vuex
dispatch
方法(显然)总是会返回
承诺,即使正在调度的方法不是
异步的
。是的,您需要
如果(等待调度(…)
我认为,这里混乱的根本原因是Vuex
调度
方法(显然)总是会返回一个
承诺
,即使正在调度的方法不是
异步的
。是的,您需要
if(等待分派(…)