[IMP] store: commit a mutation in a mutation

This commit is contained in:
Alexandre Kühn
2019-04-15 10:21:33 +02:00
committed by Géry Debongnie
parent 9ee85e220b
commit 7e7226213a
2 changed files with 45 additions and 16 deletions
+15 -5
View File
@@ -21,6 +21,7 @@ export class Store extends EventBus {
state: any; state: any;
actions: any; actions: any;
mutations: any; mutations: any;
_commitLevel: number = 0;
_isMutating: boolean = false; _isMutating: boolean = false;
history: any[] = []; history: any[] = [];
debug: boolean; debug: boolean;
@@ -64,21 +65,27 @@ export class Store extends EventBus {
} }
} }
async commit(type, payload?: any) { commit(type, payload?: any) {
if (!this.mutations[type]) { if (!this.mutations[type]) {
throw new Error(`[Error] mutation ${type} is undefined`); throw new Error(`[Error] mutation ${type} is undefined`);
} }
this._commitLevel++;
const currentRev = this.observer.rev; const currentRev = this.observer.rev;
this._isMutating = true; this._isMutating = true;
this.observer.allowMutations = true; this.observer.allowMutations = true;
this.mutations[type].call( this.mutations[type].call(
null, null,
{ state: this.state, set: this.observer.set }, {
commit: this.commit.bind(this),
state: this.state,
set: this.observer.set
},
payload payload
); );
this.observer.allowMutations = false;
if (this._commitLevel === 1) {
this.observer.allowMutations = false;
if (this.debug) { if (this.debug) {
this.history.push({ this.history.push({
state: this.state, state: this.state,
@@ -86,13 +93,16 @@ export class Store extends EventBus {
payload: payload payload: payload
}); });
} }
await Promise.resolve(); Promise.resolve().then(() => {
if (this._isMutating) { if (this._isMutating) {
this._isMutating = false; this._isMutating = false;
if (currentRev !== this.observer.rev) { if (currentRev !== this.observer.rev) {
this.trigger("update", this.state); this.trigger("update", this.state);
} }
} }
});
}
this._commitLevel--;
} }
} }
+19
View File
@@ -76,6 +76,25 @@ describe("basic use", () => {
expect(store.state.n).toBe(101); expect(store.state.n).toBe(101);
}); });
test("can commit a mutation in a mutation", () => {
const state = { n: 1 };
const mutations = {
inc({ state }) {
state.n++;
},
inc10({ commit }) {
for (let i = 0; i < 10; i++) {
commit("inc");
}
}
};
const store = new Store({ state, mutations });
expect(store.state.n).toBe(1);
store.commit("inc10");
expect(store.state.n).toBe(11);
});
test("dispatch allow synchronizing between actions", async () => { test("dispatch allow synchronizing between actions", async () => {
const state = { n: 1 }; const state = { n: 1 };
const mutations = { const mutations = {