-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgenerators-real-usecase.js
More file actions
124 lines (82 loc) · 2.13 KB
/
Copy pathgenerators-real-usecase.js
File metadata and controls
124 lines (82 loc) · 2.13 KB
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
119
120
121
122
123
124
// large dataset process
// for example get 1M user
const users = await prisma.user.findMany();
// but problem is 1M user can come into memory at once
// solution is use generator
function* usersGenerator(users) {
for (const user of users) {
yield user;
}
}
const generator = usersGenerator(users);
console.log(generator.next().value);
console.log(generator.next().value);
// here, Instead of processing everythings at once, we can process them one by one
// real use case
// 1M users email processing
// CSV export
// Report generation
// Data migration
// Bulk processing
// Analytics calculation
// Database Pagination
async function* orderPages() {
let page = 1;
while (true) {
const orders = await getOrders(page);
if (orders.length === 0) {
break;
}
yield orders;
page++;
}
}
// then
for await (const orders of orderPages()) {
console.log("Processing:", orders.length);
await processOrders(orders);
}
// API Pagination / Infinite Data
async function* fetchUsers() {
let page = 1;
while (true) {
const response = await fetch(
`https://example.com/api/users?page=${page}`
);
const users = await response.json();
if (users.length === 0) {
return;
}
yield* users;
page++;
}
}
// then
for await (const user of fetchUsers()) {
console.log(user);
}
// Batch Processing
// Let's say we need to send notifications to 50000 users
// if run sendNotificationToAllUsers(); then server load problem happen
// to solve this need to use generator function with batching
async function* batches(items, size) {
for (let i = 0; i < items.length; i += size) {
yield items.slice(i, i + size);
}
}
// then use
const users = getUsers();
for await (const batch of batches(users, 100)) {
await sendNotifications(batch);
}
// Queue / Job Processing
function* jobGenerator(jobs) {
for (const job of jobs) {
yield job;
}
}
const jobs = jobGenerator(queue);
let job;
while (!(job = jobs.next()).done) {
await processJob(job.value);
}