Tengo algunos problemas para entender el operador take (). En su definición, se supone que devuelve el primer valor emitido por el observable, pero a mí me parece que está devolviendo el último.

Probé la siguiente prueba para entenderlo mejor:

UsersService.ts

import {User} from '../models/user.model';
import {BehaviorSubject} from 'rxjs';

@Injectable({providedIn: 'root'})
export class UsersService {

  userObs = new BehaviorSubject<{test: string}>(null);

  testEmit(inp: string) {
    this.userObs.next({test: inp});
  }
}

Y un componente.

Users.component.html

  <div class="row">
    <div class="col-xs-12 col-md-6 col-md-offset-3">
      <input type="text" class="form-control" #inp>
      <button class="btn btn-primary" (click)="testTake(inp)">Emit</button>
    </div>
  </div>
</div> 

Users.component.ts

import {Component, Input, OnDestroy, OnInit} from '@angular/core';
import {User} from '../models/user.model';
import {UsersService} from '../services/users.service';
import {interval, Observable, Observer, Subscription} from 'rxjs';
import {take} from 'rxjs/operators';

@Component({
  selector: 'app-users',
  templateUrl: './users.component.html',
  styleUrls: ['./users.component.css']
})
export class UsersComponent implements OnInit, OnDestroy {
  constructor(private usersService: UsersService) {
  }

  ngOnInit(): void {
    this.usersService.userObs.pipe(take(1)).subscribe((data: {test: string}) => {
      console.log(data.test);
    });
  }

  testTake(inp: HTMLInputElement) {
    this.usersService.testEmit(inp.value);
  }
}

En la vista, escribo algo en la entrada y hago clic en el botón para emitirlo y luego voy a otro componente y vuelvo a este para volver a activar la función OnInit () y lo que obtengo en la consola es el último valor que escribí. en la entrada. ¿Estoy viendo esto de la manera incorrecta?

Gracias por su tiempo y ayuda.

0
Veoxer 26 jul. 2020 a las 20:16

1 respuesta

La mejor respuesta

Eso es muy obvio ya que BehaviorSubject tiene la característica de que almacena el valor "actual". Esto significa que siempre puede obtener directamente el último valor emitido del BehaviorSubject .

Y está utilizando el servicio singleton. Entonces, cuando se mueva a otra ruta y regrese, emitirá el último valor almacenado.

Esto podría ayudarlo a comprenderlo mejor

Si eso no es lo que desea, le recomiendo usar Subject en lugar de BehaviourSubject.

2
micronyks 26 jul. 2020 a las 17:29