-
Notifications
You must be signed in to change notification settings - Fork 10
/
4.html
118 lines (107 loc) · 3.07 KB
/
4.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>4</title>
<script>const {log, clear} = console;</script>
<script src="fx.0.10.1.js"></script>
<script>
const { L, go, map, each, reduce, flat, add, join, delay } = fx;
</script>
</head>
<body>
11. 시간을 이터러블로 다루기
<script type="module">
(async function() {
try {
const res = await go(
L.range(0, Infinity),
L.map(a => asdasddelay(100, a)),
L.filter(a => a % 2),
L.take(3),
reduce(add));
log(res + 10);
} catch (e) {
// log('hi~~');
}
}) ();
</script>
12. 아임포트 결제 누락 처리 스케쥴러 만들기
- https://github.com/iamport/iamport-manual/blob/master/%EC%9D%B8%EC%A6%9D%EA%B2%B0%EC%A0%9C/README.md#23-notification-url%EA%B0%80%EC%83%81%EA%B3%84%EC%A2%8C-%EC%9E%85%EA%B8%88%ED%86%B5%EB%B3%B4-%ED%8F%AC%ED%95%A8
- https://api.iamport.kr/
<script type="module">
const { delay, L, C, go, map, each, reject, flat, join } = fx;
const Impt = {
payments: {
1: [
{ imp_id: 11, order_id: 1, amount: 15000 },
{ imp_id: 12, order_id: 2, amount: 25000 },
{ imp_id: 13, order_id: 3, amount: 10000 }
],
2: [
{ imp_id: 14, order_id: 4, amount: 25000 },
{ imp_id: 15, order_id: 5, amount: 45000 },
{ imp_id: 16, order_id: 6, amount: 15000 }
],
3: [
{ imp_id: 17, order_id: 7, amount: 20000 },
{ imp_id: 18, order_id: 8, amount: 30000 },
],
4: [],
5: [],
//...
},
getPayments: page => {
console.log(`http://..?page=${page}`);
return delay(3000, Impt.payments[page]);
},
cancelPayment: async imp_id => {
await delay(1000, undefined);
log(`${imp_id} 취소완료`);
}
};
const DB = {
getOrders: ids => {
log(`SELECT id FROM orders WHERE id IN (${ids.join(',')})`);
return delay(100, [
{ id: 1 },
{ id: 3 },
{ id: 5 },
{ id: 7 },
{ id: 8 },
])
}
};
async function job() {
// 결제된 결제모듈측 payments 가져온다.
// page 단위로 가져와야한다.
// 결제 데이터가 있을 때까지 모두 가져와서 하나로 합친다.
const payments = await go(
L.range(1, Infinity),
L.map(Impt.getPayments),
L.takeUntil(({length}) => length < 3),
flat);
// 결제되었다는 가맹점측 주문서 ids들을 뽑아서
// 가맹점 DB에 정상적으로 주문이 된 가맹정측 주문서들을 가져와서 id만 뽑는다.
// DB.getOrders(ids): SELECT * FROM orders WHERE id IN (ids)
const orderIds = await go(
payments,
map(p => p.order_id),
DB.getOrders,
map(o => o.id));
// 결제모듈의 payments와 가맹점의 주문서를 비교해서
// 결제를 취소해야할 id들을 뽑아서
// 결제 취소 api를 실행
return go(
payments,
L.reject(p => orderIds.includes(p.order_id)),
map(p => p.imp_id),
C.map(Impt.cancelPayment));
}
// each(_ => Promise.all([
// job(),
// go(delay(7000, undefined), _ => log('7초 지남~~'))
// ]), L.range(Infinity));
</script>
</body>
</html>