この解答例はChatGPTによって生成されています,正しいかは自己判断で。 皆の投稿からも解答例が見つかるかもしれませんよ。
BFE.devでのAI解答例 - JavaScript コーディング問題
57. Observableを作る
以下が求められているObservableの実装例です。
class Observable { constructor(subscribeFunc) { this._subscribe = subscribeFunc; } subscribe(observerOrNext, error, complete) { // if observerOrNext is an observer object if (typeof observerOrNext === 'object') { return this._subscribe(observerOrNext); } // if observerOrNext is a function return this._subscribe({ next: observerOrNext, error: error, complete: complete }); } // helper method to create observable from iterable static from(iterable) { return new Observable(subscriber => { for (const item of iterable) { subscriber.next(item); } subscriber.complete(); }); } // helper method to create observable from a promise static fromPromise(promise) { return new Observable(subscriber => { promise.then( value => { subscriber.next(value); subscriber.complete(); }, reason => subscriber.error(reason) ); }); } // helper method to create observable from an event static fromEvent(target, eventName) { return new Observable(subscriber => { const eventHandler = e => subscriber.next(e); target.addEventListener(eventName, eventHandler); // return cleanup function return () => { target.removeEventListener(eventName, eventHandler); }; }); } // helper method to merge multiple observables static merge(...observables) { return new Observable(subscriber => { let activeSubscriptions = observables.length; const subscriptions = observables.map(obs => obs.subscribe({ next: value => subscriber.next(value), error: error => subscriber.error(error), complete: () => { activeSubscriptions--; if (activeSubscriptions === 0) { subscriber.complete(); } } }) ); // return cleanup function return () => { subscriptions.forEach(sub => sub.unsubscribe()); }; }); }}
この実装では、subscribe()メソッドの引数として、Observerオブジェクトか、next/error/completeのいずれかを含む関数を受け取り、両方の型の引数を同じように処理できます。また、from()、fromPromise()、fromEvent()、merge()といったヘルパーメソッドを持っており、Observableインスタンスを作りやすくなっています。