在TypeScript项目中,我向用户显示了一个分支对话框。显示文本并为用户显示选项,然后制定一个新分支。每个分支可能具有一个或多个与之关联的Action
,与Redux无关。为了清楚起见,我们将其称为MyAction
。
MyAction
用途广泛,您可以选择要传递的操作类型和参数。该动作对应于在ActionParser
中注册的功能,该功能负责执行这些MyAction
。
最重要的MyAction
之一是LOAD_SCENE
动作,它使用户可以切换到完全不同的场景。场景首先从服务器加载,然后在对话框树的根分支处呈现给用户。问题就从这里开始。
通常,由于用户单击UI中的按钮而显式加载了场景。调度了Thunk,加载了场景,进行了解析,然后调度了一个动作,通知我们加载成功:
这种情况的发生方式如下:
在步骤5中处理动作。 LOAD_SCENE操作如下所示:
ActionParser.register("LOAD_SCENE", async (args) => {
if (args.scene) {
Store.get().dispatch(loadSceneStart());
await SceneManager.loadScene(args.scene);
Store.get().dispatch(loadSceneSuccess(SceneManager.activeScene.author));
} else {
throw new Error("action 'LOAD_SCENE' requires 'scene' argument");
}
});
问题很明显:
MyAction
始终作为业务逻辑的一部分被触发。由于它们可能会产生副作用,因此我希望动作的结果能够影响状态,但是同时,我也不想从动作中分派动作。这是dispatch
函数,可以完成所有操作。
public static onSelectOption(dispatch: Dispatch, branch: string) {
try {
SceneManager.selectBranch(branch); // MyActions are processed here. Side effects of MyActions may have happened.
// These fire immediately because some MyActions may be asynchronous.
if (SceneManager.sceneIsFinished) {
dispatch(setMode(Mode.MainMenu));
} else {
dispatch(updateScene(SceneManager.dialogue, SceneManager.options));
}
} catch (error) {
dispatch(setGameView(View.Error));
dispatch(setError(error.stack || error.message));
}
}
处理副作用的最佳方法是什么?如何最好地处理更改以反映在UI和状态中?需要明确的是,我的代码可以工作,但是我觉得我做错了方法。