Проблема жизненного цикла в VueX - PullRequest
0 голосов
/ 25 января 2020

Я использую аутентификацию Firebase для получения аутентификации пользователя и Firestore для базы данных, но не могу синхронизировать c между пользователем и его кампаниями.

Мне нужно передать идентификатор пользователя, чтобы получить его кампании. Но это действие вызывается, прежде чем у меня есть пользователь в магазине. Я попытался вставить обещание в действие пользователя Fetch, чтобы после возврата обещания он выполнял кампании. Я попробовал этот код:

      let promise = new Promise((resolve, reject) => {
        if (user.uid) {
          console.log(`Done fetchUser ${user.uid}`);

          commit("SET_LOGGED_IN", user !== null);
          if (user) {
            commit("SET_USER", {
              displayName: user.displayName,
              email: user.email,
              id: user.uid,
              photoUrl: user.photoURL,
            });
            const userProfile = {
              uid: user.uid,
            };
            const role = {
              role: isMobile,
            }
            firebase.firestore().collection("user_profile").doc(user.uid)
              .set(userProfile, { merge: true });
            firebase.firestore().collection("user_roles").doc(user.uid)
              .set(role, { merge: true });
            console.log('Resolving promise');
            resolve(user);
          } else {
            commit("SET_USER", null);
            console.log('Rejecting promise');
            reject();
          }

        }
      });
      return promise;
    },

Я вызвал это действие при изменении аутентификации. и действие кампании:

 campaigns: firestoreAction(({ bindFirestoreRef, getters }) => {
      //return the promise returned by `bindFirestoreRef`
      let user = getters.user;
      let promise = dispatch('fetchUser', {user});
      console.log(`promise is ${promise}`);
      promise.then(function(user) {
      return bindFirestoreRef(
        'campaigns',
        firebase.firestore().collection(`user_profile`).doc(getters.user.data.id).collection("campaigns"))
      });
      return promise;
    }),

и вызвало действие кампании на странице созданной функции.

Но не получите результата и ошибки. Как вызвать обещание внутри обещания?

...