Skip to content

Commit a5d670b

Browse files
committed
Add events
1 parent 99de63a commit a5d670b

1 file changed

Lines changed: 83 additions & 0 deletions

File tree

JavaScript/7-events.js

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
'use strict';
2+
3+
function Transaction() {}
4+
5+
Transaction.start = (data) => {
6+
console.log('\nstart transaction');
7+
const events = {
8+
commit: [], rollback: [], timeout: [], change: []
9+
};
10+
let delta = {};
11+
12+
const emit = (name) => {
13+
const event = events[name];
14+
for (const listener of event) listener(data);
15+
};
16+
17+
const methods = {
18+
commit: () => {
19+
Object.assign(data, delta);
20+
delta = {};
21+
emit('commit');
22+
},
23+
rollback: () => {
24+
delta = {};
25+
emit('rollback');
26+
},
27+
clone: () => {
28+
const cloned = Transaction.start(data);
29+
Object.assign(cloned.delta, delta);
30+
return cloned;
31+
},
32+
on: (name, callback) => {
33+
const event = events[name];
34+
if (event) event.push(callback);
35+
}
36+
};
37+
38+
return new Proxy(data, {
39+
get(target, key) {
40+
if (key === 'delta') return delta;
41+
if (methods.hasOwnProperty(key)) return methods[key];
42+
if (delta.hasOwnProperty(key)) return delta[key];
43+
return target[key];
44+
},
45+
getOwnPropertyDescriptor: (target, key) => (
46+
Object.getOwnPropertyDescriptor(
47+
delta.hasOwnProperty(key) ? delta : target, key
48+
)
49+
),
50+
ownKeys() {
51+
const changes = Object.keys(delta);
52+
const keys = Object.keys(data).concat(changes);
53+
return keys.filter((x, i, a) => a.indexOf(x) === i);
54+
},
55+
set(target, key, val) {
56+
console.log('set', key, val);
57+
if (target[key] === val) delete delta[key];
58+
else delta[key] = val;
59+
return true;
60+
}
61+
});
62+
};
63+
64+
// Usage
65+
66+
const data = { name: 'Marcus Aurelius', born: 121 };
67+
68+
const transaction = Transaction.start(data);
69+
70+
transaction.on('commit', () => {
71+
console.log('\ncommit transaction');
72+
});
73+
74+
transaction.on('rollback', () => {
75+
console.log('\nrollback transaction');
76+
});
77+
78+
transaction.city = 'Shaoshan';
79+
transaction.rollback();
80+
transaction.city = 'Shaoshan';
81+
transaction.commit();
82+
83+
console.dir({ data });

0 commit comments

Comments
 (0)