如何根据另一个异步操作的结果来调度多个异步操作?

时间:2019-05-29 04:36:56

标签: redux flutter dart redux-thunk flutter-redux

一旦我的用户登录成功并且我有一个Firebase用户,我想通过分派一个进行异步调用以获取Profile的操作来检查服务器上是否已创建Profile。

如果未返回任何配置文件,我想将应用程序导航到“配置文件创建”页面,否则,请加载“配置文件”页面。

我正在考虑在登录中间件中分派第二个操作,但是在登录中间件中混用配置文件和登录代码似乎很奇怪。

是否有更好的方法或标准方法来做我想做的事情?

我什么都没尝试,但是我正在考虑在登录中间件中调度第二个操作,然后从那里导航到所需的页面。

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));
  }
};

编辑: 我只是想过一种似乎比我以前的建议更好的方法。

如果成功登录后我将其导航到“个人资料”页面,该怎么办。在“个人档案”页面的初始位置,我将调度该动作以获取“个人档案”。中间件和化简器完成后,根据Profile是否在AppState中初始化,“个人资料”页面的呈现方式会有所不同。

这看起来可以吗,或者有其他更好的方法吗?

1 个答案:

答案 0 :(得分:0)

  

在ProfilePage的GetProfileAction()上投放onInit

由于以下原因,您建议的第二个解决方案更合适:

  1. Redux鼓励功能之间完全分开。每个不同的功能都应尽可能地写成不同的:您不希望将属于登录的操作与属于配置文件的操作混合使用。这使得用Redux架构编写的应用程序非常易于维护,可以轻松完成转移或替换功能。想象一下,如果您的应用有一天决定删除登录功能。这种代码分离将大大减少所需的更改。
  2. 使用主触发器来调度操作。在调度操作之前,您应该问自己启动此操作的主要原因是什么?是成功登录还是主要触发获取用户个人资料的个人资料页面初始化?我个人认为我们应该始终在加载配置文件页面时分派获取用户的配置文件,因为此页面完全取决于从此操作中检索到的数据。考虑一下这种方式,如果由于登录以外的其他原因初始化了“个人档案”页面,将会发生什么?尽管该状态下没有可用的配置文件数据,您的应用最终将被迫构建“配置文件页面”。
  3. 可作为“刷新”操作重用。我认为用户的个人资料数据一直在变化,需要不断更新。重新加载或重新初始化“个人档案”页面时,至少应这样做。您不希望用户注销,然后重新登录到应用程序以分发获取用户的个人资料数据,对吗?是的,您可以在多个不同的位置分派相同的动作,但是最好将其保持在最小。