Как отправить несколько асинхронных действий, основанных на результате другого асинхронного действия?

После успешного входа в систему моего пользователя, когда у меня есть пользователь Firebase, я хочу проверить, есть ли уже созданный профиль на моем сервере, отправив действие, которое выполняет асинхронный вызов для получения профиля.

Если профиль не возвращен, я хочу переместить приложение на страницу создания профиля, в противном случае загрузите страницу профиля.

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

Есть ли лучший или стандартный способ сделать то, что я пытаюсь сделать?

Я ничего не пробовал, но я думал о том, чтобы отправить второе действие в промежуточном программном обеспечении для входа и перейти оттуда к нужной странице.

ThunkAction<AppState> logIn = (Store<AppState> store) async {
  store.dispatch(UserLoginAction());

  try {
    final GoogleSignIn _googleSignIn = new GoogleSignIn();
    GoogleSignInAccount googleUser = await _googleSignIn.signIn();
    GoogleSignInAuthentication googleAuth = await googleUser.authentication;

    final FirebaseAuth _auth = FirebaseAuth.instance;
    final FirebaseUser _fb = await _auth.signInWithGoogle(
      accessToken: googleAuth.accessToken,
      idToken: googleAuth.idToken,
    );

    User user = new User(id: _fb.uid, name: _fb.displayName, email: _fb.email, photoUrl: _fb.photoUrl);
    store.dispatch(UserLoginSuccessAction(user: user));

    store.dispatch(GetProfileAction());

    Profile profile = await ProfileService.get().getProfile(_fb.uid);

    store.dispatch(GetProfileSuccessAction(profile: profile));

    if (profile) {
      // Navigate to Profile Page
    } else {
      // Navigate to Profile Creation Page
    }

  } catch(error) {
    store.dispatch(UserLoginFailAction(error: error));
  }
};

Изменить: я просто подумал о способе, который кажется лучше, чем мое предыдущее предложение.

Что делать, если после успешного входа я просто перехожу на страницу профиля. На странице инициализации профиля я бы отправил действие, чтобы получить профиль. Страница профиля будет отображаться по-разному в зависимости от того, был ли профиль инициализирован в AppState после завершения промежуточного программного обеспечения и редуктора.

Кажется ли это нормально делать или есть другой и лучший способ?

1 ответ

Решение

отправка GetProfileAction() на странице профиля onInit,

Ваше второе предлагаемое решение более подходит по этим причинам:

  1. Redux поощряет полное разделение функций. Каждая отдельная функция должна быть написана как можно более четко: вы не хотите смешивать действия, принадлежащие входу в систему, с действиями, принадлежащими профилю. Это то, что делает приложения, написанные в архитектуре Redux, очень удобными в обслуживании, где можно легко выполнять перемещение или замену функций. Представьте, что однажды ваше приложение решило удалить функцию входа в систему. Такое разделение кода значительно минимизирует требуемые изменения.
  2. Используйте основной триггер для отправки действия. Прежде чем отправлять действие, вы должны спросить себя, что является основной причиной запуска этого действия? В этом случае это будет успешный вход в систему или инициализация страницы профиля, которая в первую очередь инициирует получение профиля пользователя? Я лично считаю, что мы всегда должны получать профиль пользователя при загрузке страницы профиля, поскольку эта страница полностью зависит от данных, полученных в результате этого действия. Подумайте так: что произойдет, если страница профиля инициализируется по каким-либо причинам, кроме входа в систему? Ваше приложение будет вынуждено создать страницу профиля, хотя данные профиля в этом состоянии недоступны.
  3. Можно использовать как действие "Обновить". Я предполагаю, что данные профиля пользователя постоянно меняются и требуют постоянного обновления. Это должно быть сделано как минимум при перезагрузке или повторной инициализации страницы профиля. Вы не ожидаете, что пользователи выйдут из системы и снова войдут в приложение, чтобы отправить данные профиля пользователя, не так ли? Да, вы можете отправлять одно и то же действие в нескольких разных местах, но его минимальное значение будет идеальным.
Другие вопросы по тегам