実装

束ね配信は、毎正時に列を空にするだけで作れる

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. 1

    12 行目

    次の正時までの待ち時間を出す

    起動した時刻によらず、配信を毎時 0 分に揃える

  2. 2

    14 行目

    たまった分を一度に渡す

    splice(0) で列を空にし、同じ通知を二度渡さない

  3. 3

    15 行目

    以後は 1 時間ごと

    最初の 1 回だけ待ち時間がずれ、2 回目からは等間隔

山野ほか 通知の束ね配信と作業の中断

08