この解答例はChatGPTによって生成されています,正しいかは自己判断で。 皆の投稿からも解答例が見つかるかもしれませんよ。
BFE.devでのAI解答例 - JavaScript コーディング問題
130. LazyMan() を作る
以下がJavaScriptの解答例になります。
function LazyMan(name, logFn) { return new LazyManObj(name, logFn);}class LazyManObj { constructor(name, logFn) { this.name = name; this.logs = []; this.logFn = logFn || console.log; this.sayHi(); this.execQueue = []; setTimeout(() => { this.next(); }, 0); } next() { const task = this.execQueue.shift(); task && task(); } sayHi() { this.enqueue(() => { this.logs.push(`Hi, I'm ${this.name}.`); this.logFn(`Hi, I'm ${this.name}.`); this.next(); }); } eat(food) { this.enqueue(() => { this.logs.push(`Eat ${food}.`); this.logFn(`Eat ${food}.`); this.next(); }); return this; } sleep(seconds) { this.enqueue(() => { this.logs.push(`(after ${seconds} seconds) Wake up after ${seconds} seconds.`); this.logFn(`(after ${seconds} seconds) Wake up after ${seconds} seconds.`); setTimeout(() => { this.next(); }, seconds * 1000); }); return this; } sleepFirst(seconds) { this.enqueue(() => { this.logs.unshift(`(after ${seconds} seconds) Wake up after ${seconds} seconds.`); this.logFn(`(after ${seconds} seconds) Wake up after ${seconds} seconds.`); setTimeout(() => { this.next(); }, seconds * 1000); }); return this; } enqueue(task) { this.execQueue.push(task); }}
解説は以下の通りです。
LazyMan
関数は、LazyManObj
クラスのインスタンスを返します。LazyManObj
クラスは、name
とlogFn
を引数に取り、それぞれメンバー変数で保管します。sayHi
関数は、遅延処理のキューにタスクを追加し、next
関数で順次実行されるようにします。eat
関数は、sayHi
と同様に遅延処理のキューにタスクを追加します。sleep
関数は、指定された秒数だけ遅延して次のタスクを実行します。sleepFirst
関数は、タスクの実行順序を優先的に設定し、本来の実行順序と逆になっても良いように、配列のunshift
関数でタスクを追加します。- タスクの順次実行には、
execQueue
配列を使って処理します。next
関数によって、キューの先頭のタスクから順に実行されます。ただし、JavaScriptの仕様上、同期的にタスクを追加した場合は、実行順序が保証されないため、setTimeout
関数でnext
関数を呼び出すようにしています。