add action cache to action manager

This commit is contained in:
Géry Debongnie
2019-03-01 11:26:00 +01:00
parent 3a44d41654
commit 470154f8f9
2 changed files with 27 additions and 3 deletions
@@ -43,6 +43,8 @@ export function actionManagerMixin<T extends ReturnType<typeof rpcMixin>>(
Base: T
) {
return class extends Base {
actionCache: { [key: number]: Promise<ActionDescription> } = {};
async doAction(request: ActionRequest) {
if (typeof request === "number") {
await this.loadAction(request);
@@ -68,13 +70,16 @@ export function actionManagerMixin<T extends ReturnType<typeof rpcMixin>>(
}
}
loadAction(id: number) {
return this.rpc({
loadAction(id: number): Promise<ActionDescription> {
if (id in this.actionCache) {
return this.actionCache[id];
}
return (this.actionCache[id] = this.rpc({
route: "web/action/load",
params: {
action_id: id
}
});
}));
}
};
}
@@ -0,0 +1,19 @@
import { makeTestStore } from "../helpers";
//------------------------------------------------------------------------------
// Tests
//------------------------------------------------------------------------------
test("does not reload action if already done", async () => {
const routes: string[] = [];
const store = makeTestStore({ rpc: async route => routes.push(route) });
expect(routes).toEqual([]);
store.doAction(32);
expect(routes).toEqual(["web/action/load"]);
store.doAction(32);
expect(routes).toEqual(["web/action/load"]);
});