使用then / catch异步获取VuexFire数据

时间:2019-11-06 02:26:12

标签: vue.js google-cloud-firestore vuex vuexfire

给出以下名为init且可正常运行的vuex动作,该动作可获取settingsaccounts集合:

actions: {
  init: firestoreAction(({ bindFirestoreRef, commit }, payload) => {
    bindFirestoreRef(
      'settings', fb.settings.doc(payload),
    )
      .then(() => commit('SETTINGS_READY', true))
      .catch((err) => {
        commit('SNACKBAR_TEXT', err.message);
        Sentry.captureException(err);
      });

    bindFirestoreRef(
      'accounts', fb.accounts.where('program', '==', payload),
    )
      .then(() => commit('ACCOUNTS_READY', true))
      .catch((err) => {
        commit('SNACKBAR_TEXT', err.message);
        Sentry.captureException(err);
      });
  }),
},

我有两个问题:

  1. 代码似乎是同步运行的,但是我希望异步获取两个集合以最大化性能。如何实现?
  2. 是否可以重构此代码以使其更简洁,同时提供示例中提供的独立(和同步)then/catch功能?

1 个答案:

答案 0 :(得分:0)

您可以使用async / await函数,然后在bindFirestoreRef构造函数中调用Promise

actions: {
init: firestoreAction(async ({ bindFirestoreRef, commit }, payload) => {
    await Promise((resolve, reject) => {
      bindFirestoreRef('settings', fb.settings.doc(payload))
        .then((res) => {
          commit('SETTINGS_READY', true);
          resolve(res);
        })
        .catch((err) => {
          commit('SNACKBAR_TEXT', err.message)
          Sentry.captureException(err)
          reject(err)
        })
    })

    await new Promise((resolve, reject) => {
      bindFirestoreRef('accounts', fb.accounts.where('program', '==', payload))
        .then((res) => {
          commit('ACCOUNTS_READY', true);
          resolve(res);
        })
        .catch((err) => {
          commit('SNACKBAR_TEXT', err.message)
          Sentry.captureException(err)
          reject(err)
        })
    })
  }) 
},