この解答例は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
関数を呼び出すようにしています。