single
Emite si solo existe un único valor que cumpla la condición
Descripción
Es como first
, pero emite un error si hay más de un valor.
Retorna un Observable que emite el único valor emitido por el Observable fuente que cumpla la condición especificada, en el caso de que exista dicho valor. Si el Observable fuente emite más de un elemento que cumpla la condición, o no emite ningún elemento, se lanzarán un IllegalArgumentException
o un NoSuchElementException
respectivamente.
Si el Observable fuente emite elementos, pero ninguno cumple la condición especificada, se emitirá undefined
.
Ejemplos
Emitir el único elemento que cumpla la condición
import { single } from "rxjs/operators";
import { from } from "rxjs";
const language$ = from([
{ name: "Java", type: "Orientado a objetos" },
{ name: "Ruby", type: "Multiparadigma" },
{ name: "Haskell", type: "Funcional" },
]);
language$
.pipe(single(({ type }) => type === "Multiparadigma"))
.subscribe(console.log);
// Salida: { name: "Ruby", type: "Multiparadigma" }
Si hay más de un elemento que cumpla la condición, se lanzará un error
import { range } from "rxjs";
import { single } from "rxjs/operators";
const number$ = range(1, 5);
number$.pipe(single((n) => n % 2 === 0)).subscribe(console.log, console.error);
// Salida: (error) Sequence contains more than one element
Si no hay ningún elemento que cumpla la condición, se emitirá undefined
import { of } from "rxjs";
import { single } from "rxjs/operators";
const user$ = of(
{ name: "NyaGarcía", age: 23 },
{ name: "zaldih", age: 21 },
{ name: "caballerog", age: 35 }
);
user$.pipe(single(({ age }) => age < 18)).subscribe(console.log);
// Salida: undefined
Ejemplos de la documentación oficial
Emitir 'Error'
import { range } from "rxjs";
import { single } from "rxjs/operators";
const numbers = range(1, 5).pipe(single());
numbers.subscribe(
(x) => console.log("Nunca se llamará"),
(e) => console.log("Error")
);
// Salida
// 'Error'
Emitir 'undefined'
import { range } from "rxjs";
import { single } from "rxjs/operators";
const numbers = range(1, 5).pipe(single((x) => x === 10));
numbers.subscribe((x) => console.log(x));
// Salida
// 'undefined'
Recursos adicionales
Last updated