- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个Vuex商店,我正在尝试从Firebase实时数据库中获取数据。我最初是在获取用户信息,但是此后,我想获取一些其他信息,这些信息取决于所获取的初始数据。
从代码中可以看到,我正在尝试使用async / await来执行此操作,但是,每当触发created()
挂钩中的两个动作时,用户的信息都不会初始化,因此第二个动作将失败。
我的用户商店
async fetchCreds({ commit }) {
try {
firebase.auth().onAuthStateChanged(async function(user) {
const { uid } = user
const userDoc = await users.doc(uid).get()
return commit('SET_USER', userDoc.data())
})
} catch (error) {
console.log(error)
commit('SET_USER', {})
}
}
async fetchClubInformation({ commit, rootState }) {
try {
const clubIDForLoggedInUser = rootState.user.clubId
const clubDoc = await clubs.doc(clubIDForLoggedInUser).get()
return commit('SET_CLUB_INFO', clubDoc.data())
} catch (error) {
console.log(error)
}
}
}
created: async function() {
await this.fetchCreds();
await this.fetchClubInformation();
this.loading = false;
}
最佳答案
我对Firebase并不是特别熟悉,但是在仔细研究了源代码之后,我认为我可以对您的问题有所了解。
首先,请考虑以下示例:
async function myFn (obj) {
obj.method(function () {
console.log('here 1')
})
console.log('here 2')
}
await myFn(x)
console.log('here 3')
here 2
肯定会在
here 3
之前出现,但是从上面的代码中无法确定
here 1
何时会出现。这取决于
obj.method
对传递的功能的处理方式。它可能根本不会调用它。它可能会同步调用它(例如Array的
forEach
方法),在这种情况下
here 1
会出现在其他消息之前。如果它是异步的(例如计时器,服务器调用),则
here 1
可能会在
here 3
之后很长时间不显示。
async
修饰符没有返回Promise本身,则将从函数隐式返回Promise。该Promise的解析值将是该函数返回的值,并且Promise将在该函数返回的位置解析。对于结尾没有
return
的函数,等效于以
return undefined
结尾。
onAuthStateChanged
异步调用其回调,因此该回调中的代码要等到周围函数完成后才能运行。没有什么可以告诉隐式返回的Promise等待该回调被调用的。回调中的
await
无关紧要,因为该函数尚未被调用。
return
或
await
相关Promise:
// Note: This WON'T work, explanation follows
return firebase.auth().onAuthStateChanged(async function(user) {
// Note: This WON'T work, explanation follows
await firebase.auth().onAuthStateChanged(async function(user) {
onAuthStateChanged
实际上没有返回Promise,而是返回了
unsubscribe
函数。
new Promise
创建新的Promises通常被认为是代码气味。通常,只有在包装不正确支持Promises的代码时才需要这样做。如果我们正在使用具有适当Promise支持的库(如此处所示),那么我们就不需要创建任何Promises。
onAuthStateChanged
为什么不返回Promise?
fetchCreds
正在注册以接收有关所有登录/注销事件的通知。它对返回的
unsubscribe
函数不做任何事情,因此大概它将一直监听所有此类事件,直到重新加载页面为止。如果多次调用
fetchCreds
,它将继续添加越来越多的侦听器。
firebase.auth()
有多种以前缀
signIn
开头的方法,例如
signInWithEmailAndPassword
,并且它们确实返回一个Promise,该Promise在用户完成登录后进行解析。解析的值提供对包括用户在内的各种信息的访问。我不知道您使用的是哪种方法,但是所有方法的想法都差不多。
onAuthStateChanged
。您应该只能够使用
currentUser
属性获取副本。像这样:
async fetchCreds({ commit }) {
try {
const { uid } = firebase.auth().currentUser
const userDoc = await users.doc(uid).get()
commit('SET_USER', userDoc.data())
} catch (error) {
console.log(error)
commit('SET_USER', {})
}
}
async
和异步的使用非常谨慎。诸如
setTimeout
的功能将被视为异步的,但不是
async
。
async
/
await
只是Promises中的很多语法糖。您并不是真正在等待功能,而是在等待Promise。当我们谈论等待
async
函数时,我们实际上是在等待等待Promise返回解决。
await
?
async
修饰符放在函数上并不能使其神奇地等待事件。它只会在遇到
await
时等待。您仍然可以在
async
函数中进行其他异步调用,并且与普通函数一样,这些调用将在函数返回后执行。 “暂停”的唯一方法是
await
一个承诺。
await
放在另一个函数(甚至是嵌套函数)中,除非外部函数已经在等待内部函数,否则外部函数是否在等待中不会有任何区别。在后台,这仅仅是Promises链接
then
调用。每当您编写
await
时,您都只是向Promise添加另一个
then
调用。但是,除非Promise与外部
async
函数返回的Promise处于同一链中,否则这将不会具有预期的效果。它只需要丢失一个链接即可使链失效。
async function myFn (obj) {
await obj.method(async function () {
await somePromise
// ...
})
// ...
}
await myFn(x)
myFn
,
method
和传递给
method
的回调。问题是,
await myFn(x)
是否会等待
somePromise
?
method
内部执行的操作。例如,如果
method
看起来像这样,那么它将仍然不起作用:
function method (callback) {
setTimeout(callback, 1000)
}
async
放在
method
上无济于事,这只会使其返回Promise,但Promise仍不会等待计时器触发。
myFn
和回调都在创建链的各个部分,但是除非
method
将那些Promises链接在一起,否则它将不起作用。
method
来返回一个适当的Promise,它等待回调完成,那么我们将获得目标行为:
function method (callback) {
return someServerCallThatReturnsAPromise().then(callback)
}
async
/
await
,但是没有必要,因为我们可以直接返回Promise。
return undefined
。
async
函数返回的Promise将在函数返回时解析。
undefined
。在功能结束之前不会进行解析。如果该函数不包含任何
await
调用,则这将“立即”发生,与同步函数“立即”返回的意义相同。
await
只是
then
调用周围的语法糖,并且
then
调用始终是异步的。因此,尽管Promise可能“立即”解决,但
await
仍然需要等待。这是一个很短的等待,但它不是同步的,其他代码可能有机会同时运行。
const myFn = async function () {
console.log('here 3')
}
console.log('here 1')
Promise.resolve('hi').then(() => {
console.log('here 4')
})
console.log('here 2')
await myFn()
console.log('here 5')
myFn
立即解决,您仍然会在
here 4
和
here 3
之间跳转
here 5
。
关于javascript - 异步和顺序触发Vuex Action -我不了解什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56878908/
我刚刚开始使用 Vuex,但遇到了问题(这可能是我的一些无能为力的语法错误)。我有一个用户喜欢 like_items 并且有一个网络调用,它与一个项目不同。 mutations: { SET_TOGG
我刚开始在这里学习 Vuex。到目前为止,我一直将共享数据存储在 store.js 中。文件和导入store在每个模块中,但这越来越烦人,我担心会发生变异。 我正在努力解决的是如何使用 Vuex 从
我正在创建一个使用 Fabric.js 来管理 Canvas 的 Vue 应用程序。 我想使用 Vuex 管理 Canvas 状态。为此,我将 fabric canvas 实例设置为 vuex 状态变
我正在构建一个 Nuxt 应用程序,我正在从我在本地主机上运行的节点后端获取一些数据。 我有一个插件 getApps.js export default ({ store }) => { st
我想安装 Vuex 但出现错误。 // error npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree
我使用 vuex-persistedstate 包( https://github.com/robinvdvleuten/vuex-persistedstate )在浏览器上保持数据状态。 我使用 A
假设我有一个简单的 Vuex 状态来保存食谱: const state = { recipe: { id: '', name: "", ingr
目前,我有一个具有 2 个状态属性的商店 - 版本和冠军 + 2 个发出 GET 请求然后提交到状态的操作。第二个 GET 请求 URL 需要包含我从第一个 GET 请求获取的版本,如下所示: axi
我有一个基于 Vue 和 Vuex 的小应用程序。它只是一个包含类似项目的表格 {{ item.name }} Edit Items 数组是使用 getter 从
我有一个 Vuex getter,我从应用程序中的各个组件调用它。但是,我发现在调用 getter 之前需要稍微复杂一些的逻辑,所以我使用了 Vuex Action。如何使用操作中的参数调用 gett
为什么会出现此错误: Error [vuex] Do not mutate vuex store state outside mutation handlers. 这是什么意思? 当我尝试输入编辑输入
在 Nuxt 文档(here)中,它说“您可以选择将模块文件分解为单独的文件:state.js、actions.js、mutations.js 和 getters.js。” 我似乎找不到任何示例来说明
我正在使用 TypeScript 构建一个简单的 vue 项目。我在我的 vue 项目中编写了 vuex 商店,该商店有一个名为“计算”的子模块。但是一旦创建了包含子模块的主存储,就会发生奇怪的错误(
我完全熟悉 Vuex,但我对 Vue 组合 API 一无所知。这到底是怎么回事,它和Vuex有什么区别?它涵盖了 Vuex 中的哪些差距,以及何时何地使用它们更好? 感谢您的帮助。 最佳答案 首先,
简短的问题:是否可以通过 Nuxt Auth 模块手动更新 Vuex 中的用户数据? 为什么我有这个问题:我的问题是这个。我在用户文档中的 MongoDB 中保存了一些 Likes/Follows。我
尝试将带有 vuex-module-decorators 的存储模块加载到初始化程序中时出现此错误: vuex.esm.js?2f62:261 Uncaught TypeError: Cannot r
我有一个 VueX 商店,有两个模块,user.js 和merchant.js,顶层是index.js。 user.js 中的 getter 是: 重构 const getters = { s
我在我的代码库中偶然发现了这个错误,并试图看看是否有人可以修复它。 以下是我的 listings/actions.js export const fetchFeaturedListings = ({
我正在尝试将 Vuex 与 Vue 3 一起使用。这是我在 main.js 中的代码: import { createApp } from 'vue'; import App from './App.
我在我的代码库中偶然发现了这个错误,并试图看看是否有人可以修复它。 以下是我的 listings/actions.js export const fetchFeaturedListings = ({
我是一名优秀的程序员,十分优秀!