mi código: https://stackblitz.com/edit/rxjs-fgzw2i?devtoolsheight=60&file=index.ts
export class myCalss { sub$: BehaviorSubject<number>; constructor() { this.sub$ = new BehaviorSubject(0); } test() { from([1,2,3,4]).subscribe( this.sub$.next, // num => this.sub$.next(num) console.log ) } }Es mi código. Hay un error en el código, pero no sé por qué. Por favor, hágamelo saber si hay algún problema en este código. Especialmente cuando el valor se pasa dentro de la función de suscripción, tengo curiosidad sobre la parte en la que desea pasar el valor pasado al sub$. Normalmente, escribo el código de la siguiente manera.
num => this.sub$.next(num)
Pero descubrí que también puedo escribirlo así, ¿no? this.sub$.next
No puede hacer eso en este caso, porque su Subject es del tipo <number> . Si no recuerdo mal a partir de rxjs 7 , puede llamar a this.sub$.next() sin argumentos, pero el Subject debe ser del tipo <void> . El único uso que tiene son los casos en que el valor emitido no tiene ninguna importancia, lo que tiene importancia es el hecho de que el valor fue emitido, aunque no sea nothing . Según los documentos , un ejemplo sería un timer reactivo, de todos modos no puedo ver el punto. ¿Por qué lo llamarías con un argumento vacío? No está claro para alguien que no ha visto el proceso de desarrollo. Causa problemas cuando se usa en combinación con takeUntil . Además, esto puede generar un error de compilación debido al strict mode . Debería ser como a continuación, bueno, no como si pudieras hacerlo de otra manera si el tipo es <number> ...
De todos modos, ha configurado una lógica que emite cierto valor, y ese valor debe tratarse en algún lugar de alguna manera, pero next() sin argumento se usa cuando el valor emitido no importa. Incluso si pudiera usarlo, es inadecuado en este caso.
Usar
test() { from([1, 2, 3, 4]).subscribe({ next: (data) => { this.sub$.next(data); }, }); }o solo
test() { from([1, 2, 3, 4]).subscribe((data) => { this.sub$.next(data); }); }Pero descubrí que también puedo escribirlo así, ¿no? esto.sub$.siguiente
Respuesta corta: lamentablemente, no. Si bien esta sintaxis no es incorrecta per se , obtiene un error porque el alcance de this se pierde si usa esta sintaxis de "función de orden superior".
Respuesta larga:
La clase Subject de la biblioteca rxjs usa la palabra clave this en algún momento, por lo que pasar la función como parámetro a la subscribe hace que pierda el alcance correcto. Considere este ejemplo:
class MockSubject { next(value) { console.log('A function not referring `this` ' + value); } }y aquí hay un ejemplo de uso como lo intentaste:
mockSubject = new MockSubject; test() { from([1, 2, 3, 4]).subscribe( this.mockSubject.next, // num => this.sub$.next(num) console.log, ); } Este ejemplo no recibe ese error porque el next método de la clase MockSubject no hace referencia a this objeto. Por supuesto, no puede saber si una función en una clase usa la palabra clave this , por lo que mi consejo es evitar esa sintaxis.
(el ejemplo completo en un stackblitz bifurcado del tuyo: https://stackblitz.com/edit/rxjs-1jrzbf?file=index.ts )
Y como consejo final, no use el método de suscripción con dos devoluciones de llamada ya que esta forma está obsoleta; use el objeto PartialObserver en su lugar de esta manera:
{ next: num => this.sub$.next(num), // num => this.sub$.next(num), error: console.log }Tu puedes hacer:
export class MyCalss { sub$: BehaviorSubject<number> = new BehaviorSubject(0); number$ = from([1, 2, 3, 4]).pipe( tap((num) => console.log), tap((num) => this.sub$.next) ); test() { this.number$.subscribe(); } }