実装
束ね配信は、毎正時に列を空にするだけで作れる
1type Notice = { id: string; from: string; at: Date };
2
3const HOUR = 60 * 60 * 1000;
4const queue: Notice[] = [];
5
6// 届いた通知は渡さずに、列にためる
7export function receive(n: Notice) {
8 queue.push(n);
9}
10
11export function startBatching(deliver: (ns: Notice[]) => void) {
12 const wait = HOUR - (Date.now() % HOUR);1
13 setTimeout(() => {
14 deliver(queue.splice(0));2
15 setInterval(() => deliver(queue.splice(0)), HOUR);3
16 }, wait);
17}
- 1
12 行目
次の正時までの待ち時間を出す
起動した時刻によらず、配信を毎時 0 分に揃える
- 2
14 行目
たまった分を一度に渡す
splice(0) で列を空にし、同じ通知を二度渡さない
- 3
15 行目
以後は 1 時間ごと
最初の 1 回だけ待ち時間がずれ、2 回目からは等間隔
山野ほか 通知の束ね配信と作業の中断
08