【問題】不安定なチャットAPI
今日はバグ修正っぽい問題です。
問
あるチャットAPIがあります。
このAPIには指定日時以降のメッセージを取得するメソッドがあります。
このメソッドを使って、定期的にメッセージし表示するアプリが作りたいです。
メッセージを取得するAPI仕様
/** * 指定日時以降のメッセージを取得する * * @param after {number} 日時 * @return {{message:string, date:number}} after以降のメッセージリスト。 * ただし、取得に失敗した場合はnullを返す。 */ getMessages(after)
失敗実装
そこでこんなふうに実装してみました。
const api = new ShakyChatApi(); setInterval(()=>{ var messages = api.getMessages(Date.now() - 3000);// 3秒前以降のメッセージを取得する if(messages !== null) { messages.forEach(v => console.log(v.message)); } }, 3000);
3秒毎にメッセージを取得して表示します。
これの実行結果
メッセージ0 メッセージ1 メッセージ2 メッセージ6 メッセージ7 メッセージ8
あれ!メッセージ4, 5がロストしてる!!
要するに先ほどの実装にはバグがあります。 前置きが長くなりましたが、今日の問題はこのバグ修正です。
下記のバグったプログラムを修正し、3秒毎にメッセージをロストすることなく取得するプログラムを作ってください。
バグってるプログラム全体
<!DOCTYPE html> <script> class ShakyChatApi { // !! このクラスは変更しちゃダメ !! constructor() { this.messages = []; var count = 0; var loop = () => { this.messages.push({message:`メッセージ${count++}`, date:Date.now()}); setTimeout(loop, Math.random() * 3000); } setTimeout(loop, 100); } /** * 指定日時以降のメッセージを取得する * * @param after {number} 日時 * @return {{message:string, date:number}} after以降のメッセージリスト。ただし、取得に失敗した場合はnullを返す。 */ getMessages(after) { if(Math.random() >= 0.66) { return null;// 不安定 } return this.messages.filter(v => v.date >= after); } } // ## !!ここより下を修正してください!! ## const api = new ShakyChatApi(); setInterval(()=>{ var messages = api.getMessages(Date.now() - 3000);// 3秒前以降のメッセージを取得する if(messages !== null) { messages.forEach(v => console.log(v.message)); } }, 3000); </script>