Skip to content

Commit c4d2ad7

Browse files
committed
Add simple transaction example
1 parent 713f93a commit c4d2ad7

File tree

1 file changed

+69
-0
lines changed

1 file changed

+69
-0
lines changed

JavaScript/1-proxy.js

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
'use strict';
2+
3+
function Transaction() {}
4+
5+
Transaction.start = (data) => {
6+
console.log('start transaction');
7+
let delta = {};
8+
9+
const methods = {
10+
commit: () => {
11+
console.log('commit transaction');
12+
Object.assign(data, delta);
13+
},
14+
rollback: () => {
15+
console.log('rollback transaction');
16+
delta = {};
17+
}
18+
};
19+
20+
return new Proxy(data, {
21+
get(target, key) {
22+
console.log('get', key);
23+
if (key === Symbol.iterator) {
24+
const changes = Object.keys(delta);
25+
const keys = Object.keys(target).concat(changes);
26+
const props = keys.filter((x, i, a) => a.indexOf(x) === i);
27+
return props[Symbol.iterator]();
28+
}
29+
return methods[key] || delta[key] || target[key];
30+
},
31+
set(target, key, val) {
32+
console.log('set', key, val);
33+
if (target[key] === val) {
34+
delete delta[key];
35+
} else {
36+
delta[key] = val;
37+
}
38+
return true;
39+
}
40+
});
41+
};
42+
43+
44+
// Usage
45+
46+
const data = { name: 'Marcus Aurelius', city: 'Rome', born: 121 };
47+
48+
const transaction = Transaction.start(data);
49+
50+
transaction.name = 'Mao Zedong';
51+
transaction.born = 1893;
52+
53+
console.log('data.name = ', data.name);
54+
console.log('transaction.name = ', transaction.name);
55+
56+
transaction.commit();
57+
58+
console.log('data.name = ', data.name);
59+
console.log('transaction.name = ', transaction.name);
60+
61+
transaction.city = 'Shaoshan';
62+
63+
console.log('data.city = ', data.city);
64+
console.log('transaction.city = ', transaction.city);
65+
66+
transaction.rollback();
67+
68+
console.log('data.city = ', data.city);
69+
console.log('transaction.city = ', transaction.city);

0 commit comments

Comments
 (0)