Estoy tratando de armar una implementación básica de una clase observable en un archivo js
export class Observable { constructor(emitter){ return this._emitter = emitter } foo(){ return'bar' } subscribe(next, error = {}, complete = {}){ if (typeof next === "function") { return this._emitter({ next, error: error, complete: complete }) } else { return this._emitter(next) } } }con un archivo de broma correspondiente
import { Observable } from "./observable"; describe("Observable", () => { test('foo', () => { let fakeAsyncData$ = new Observable(); expect(fakeAsyncData$.foo()).toBe('bar') }) test('Observable subscriptions next returns value in pipe', () => { let test_value = "testing" let fakeAsyncData$ = new Observable(observer => { observer.next(test_value); }); fakeAsyncData$.subscribe({ next(val) { expect(val).toBe(test_value) } }); }); });Por alguna razón, la segunda prueba falla debido a que la suscripción no es una función. Lo cual parece ser incorrecto. Aquí está toda la salida de broma
FAIL ./observable.test.js Observable ✓ foo (21 ms) ✕ Observable subscriptions next returns value in pipe (2 ms) ● Observable › Observable subscriptions next returns value in pipe TypeError: fakeAsyncData$.subscribe is not a function 14 | }); 15 | > 16 | fakeAsyncData$.subscribe({ | ^ 17 | next(val) { expect(val).toBe(test_value) } 18 | }); 19 | }); at Object.subscribe (observable.test.js:16:24) Test Suites: 1 failed, 1 total Tests: 1 failed, 1 passed, 2 total Snapshots: 0 total Time: 0.592 s, estimated 1 s Ran all test suites. npm ERR! Test failed. See above for more details.¿Qué he logrado arruinar aquí?
Elimina la palabra clave return del constructor. Está devolviendo el resultado de la asignación this._emitter = emitter , que es una función, como le indicará llamar a console.log(typeof fakeAsyncData$) .
Los objetos instanciados a través de un constructor no necesitan devolver explícitamente esa instancia. Hacerlo con cualquier valor no primitivo devolverá ese valor en su lugar. Los valores de retorno primitivos se ignoran; consulte MDN .