如何分派基于另一个异步操作结果的多个异步操作?
How to dispatch multiple async actions that are based on the result of another async action?
一旦我的用户登录成功并且我有一个 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 中初始化,配置文件页面将呈现不同。
这样做似乎没问题,还是有其他更好的方法?
Dispatch GetProfileAction()
on ProfilePage's onInit
.
您建议的第二个解决方案更合适,原因如下:
- Redux 鼓励功能之间的完全分离。每个不同的功能都应该尽可能不同地编写:你不想混合属于登录的操作和属于配置文件的操作.这使得使用 Redux 架构编写的应用程序非常易于维护,可以轻松完成转移或替换功能。想象一下,如果有一天您的应用程序决定删除登录功能。这种代码分离将大大减少所需的更改。
- 使用主触发器来调度一个动作。在调度一个动作之前,你应该问问自己启动这个动作的主要原因是什么? 在这种情况下,是成功登录还是主要触发获取用户配置文件的配置文件页面初始化?我个人认为我们应该始终在配置文件页面加载时调度获取用户的配置文件,因为此页面完全依赖于从此操作检索的数据。这样想,如果Profile页面因为登录以外的原因被初始化了会怎样呢?尽管配置文件数据在该州不可用,但您的应用最终将强制构建配置文件页面。
- 可作为刷新操作重复使用。我假设用户的个人资料数据不断变化,需要不断更新。这应该至少在重新加载或重新初始化配置文件页面时完成。您不希望用户注销并重新登录到应用程序以发送获取用户的个人资料数据,对吗?是的,您可以在多个不同的地方分派相同的操作,但最好将其保持在最低限度。
一旦我的用户登录成功并且我有一个 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 中初始化,配置文件页面将呈现不同。
这样做似乎没问题,还是有其他更好的方法?
Dispatch
GetProfileAction()
on ProfilePage'sonInit
.
您建议的第二个解决方案更合适,原因如下:
- Redux 鼓励功能之间的完全分离。每个不同的功能都应该尽可能不同地编写:你不想混合属于登录的操作和属于配置文件的操作.这使得使用 Redux 架构编写的应用程序非常易于维护,可以轻松完成转移或替换功能。想象一下,如果有一天您的应用程序决定删除登录功能。这种代码分离将大大减少所需的更改。
- 使用主触发器来调度一个动作。在调度一个动作之前,你应该问问自己启动这个动作的主要原因是什么? 在这种情况下,是成功登录还是主要触发获取用户配置文件的配置文件页面初始化?我个人认为我们应该始终在配置文件页面加载时调度获取用户的配置文件,因为此页面完全依赖于从此操作检索的数据。这样想,如果Profile页面因为登录以外的原因被初始化了会怎样呢?尽管配置文件数据在该州不可用,但您的应用最终将强制构建配置文件页面。
- 可作为刷新操作重复使用。我假设用户的个人资料数据不断变化,需要不断更新。这应该至少在重新加载或重新初始化配置文件页面时完成。您不希望用户注销并重新登录到应用程序以发送获取用户的个人资料数据,对吗?是的,您可以在多个不同的地方分派相同的操作,但最好将其保持在最低限度。