Skip to content

range() - Genera un range numerico

range()` è una Creation Function simile a un for statement che genera un numero specifico di numeri interi consecutivi a partire da un valore iniziale specificato.

Panoramica.

range()emette una sequenza di numeri interi consecutivi come Observable, specificando un valore iniziale e il numero di numeri interi. Viene utilizzata per la generazione di numeri sequenziali e per l'elaborazione in batch, come alternativa dichiarativa alla tradizionale istruzionefor`.

Firma:.

typescript
function range(
  start: number,
  count?: number,
  scheduler?: SchedulerLike
): Observable<number>

Parametri:.

  • start: il valore iniziale (l'emissione inizia da questo valore).
  • count: numero di valori da pubblicare (omesso, da 0 a meno di start).
  • scheduler: Scheduler per emettere i valori (omesso, emessi in modo sincrono).

Documentazione ufficiale: 📘 Formula RxJS: range()

Utilizzo di base.

Schema 1: Specificare il valore iniziale e il numero di pezzi

Uso più comune.

typescript
import { range } from 'rxjs';

// 1da5Vengono generati numeri sequenziali (1, 2, 3, 4, 5)
range(1, 5).subscribe({
  next: value => console.log('Valore:', value),
  complete: () => console.log('Completato')
});

// Uscita:
// Valore: 1
// Valore: 2
// Valore: 3
// Valore: 4
// Valore: 5
// Completato

Schema 2: Numeri sequenziali a partire da 0

Impostando il valore iniziale a 0, è possibile generare un numero sequenziale come indice di un array.

typescript
import { range } from 'rxjs';

// 0da10Generazione di numeri sequenziali (0, 1, 2, ..., 9)
range(0, 10).subscribe(console.log);
// Uscita: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9

Schema 3: Iniziare con un numero negativo

Può essere generato anche da numeri negativi.

typescript
import { range } from 'rxjs';

// -3da5Generazione di numeri sequenziali (-3, -2, -1, 0, 1)
range(-3, 5).subscribe(console.log);
// Uscita: -3, -2, -1, 0, 1

Caratteristiche principali.

1. emesso in modo sincrono

range()` emette tutti i valori in modo sincrono con sottoscrizione per impostazione predefinita.

typescript
import { range } from 'rxjs';

console.log('Prima della sottoscrizione');

range(1, 3).subscribe(value => console.log('Valore:', value));

console.log('Dopo la sottoscrizione');

// Uscita:
// Prima della sottoscrizione
// Valore: 1
// Valore: 2
// Valore: 3
// Dopo la sottoscrizione

2. completamento immediato.

Notifica il completamento immediatamente dopo che tutti i valori sono stati emessi.

typescript
import { range } from 'rxjs';

range(1, 3).subscribe({
  next: val => console.log(val),
  complete: () => console.log('Completato!')
});

// Uscita: 1, 2, 3, Completato!

3. equivalenza con l'istruzione for

range(start, count)` è equivalente alla seguente istruzione for.

typescript
// ImperativoforFrase
for (let i = start; i < start + count; i++) {
  console.log(i);
}

// Dichiarativorange()
range(start, count).subscribe(console.log);

Caso d'uso pratico.

1. elaborazione in batch

Utilizzata per l'esecuzione sequenziale di più attività.

typescript
import { range, of, Observable, concatMap, delay, map } from 'rxjs';
// Funzioni che simulano l'elaborazione dei dati
function processItem(index: number): Observable<string> {
  return of(index).pipe(
    delay(100), // 100msSimulare i tempi di elaborazione per
    map(i => `elemento${i}Risultati dell'elaborazione di`)
  );
}

// 10Elaborazione sequenziale dei dati per un elemento (con un ritardo di1secondi di ritardo tra un'elaborazione e l'altra)
range(1, 10).pipe(
  concatMap(index =>
    processItem(index).pipe(delay(1000))
  )
).subscribe({
  next: result => console.log(`Elaborazione completata: ${result}`),
  complete: () => console.log('Tutte le elaborazioni sono state completate')
});

// Uscita:
// Elaborazione completata: elemento1Risultati dell'elaborazione di (Dopo circa1.1secondi dopo)
// Elaborazione completata: elemento2Risultati dell'elaborazione di (Dopo circa2.1secondi dopo)
// ...
// Elaborazione completata: elemento10Risultati dell'elaborazione di (Dopo circa10.1secondi dopo)
// Tutte le elaborazioni sono state completate

2. paginazione

Recupera i dati di più pagine in modo sequenziale.

typescript
import { range, of, Observable, concatMap, delay } from 'rxjs';
interface PageData {
  page: number;
  items: string[];
}

// Funzione per simulare l'acquisizione dei dati della pagina
function fetchPage(page: number): Observable<PageData> {
  return of({
    page,
    items: [`elemento${page}-1`, `elemento${page}-2`, `elemento${page}-3`]
  }).pipe(
    delay(500) // APISimulare la chiamata
  );
}

function fetchAllPages(totalPages: number) {
  return range(1, totalPages).pipe(
    concatMap(page => fetchPage(page))
  );
}

fetchAllPages(5).subscribe({
  next: (data: PageData) => console.log(`Pagina ${data.page}:`, data.items),
  complete: () => console.log('Completamento di tutte le acquisizioni di pagine')
});

// Uscita:
// Pagina 1: ['elemento1-1', 'elemento1-2', 'elemento1-3']
// Pagina 2: ['elemento2-1', 'elemento2-2', 'elemento2-3']
// Pagina 3: ['elemento3-1', 'elemento3-2', 'elemento3-3']
// Pagina 4: ['elemento4-1', 'elemento4-2', 'elemento4-3']
// Pagina 5: ['elemento5-1', 'elemento5-2', 'elemento5-3']
// Completamento di tutte le acquisizioni di pagine

3. Elaborare gli indici degli array

Utilizzato come ciclo basato sull'indice per l'elaborazione di ciascun elemento di un array.

typescript
function range(
  start: number,
  count?: number,
  scheduler?: SchedulerLike
): Observable<number>

4. Generare i dati di prova

È utile per generare dati finti nei test unitari.

5. Contatore del processo di ripetizione

Controlla il numero di tentativi in caso di errori.

Asincronizzazione tramite scheduler

Quando si elaborano grandi quantità di dati, è possibile specificare uno scheduler per l'esecuzione asincrona.

TIP

Utilizzo dello scheduler:.

  • Non bloccare l'interfaccia utente con l'elaborazione di dati di massa.
  • Controllo del tempo nei test (Scheduler) Controllo dei cicli di eventi in ambienti Node.js

Per ulteriori informazioni, vedere [Tipi di scheduler e loro utilizzo] (/it/guide/schedulers/types).

Confronto con altre Creation Function

range() vs of()

typescript
function range(
  start: number,
  count?: number,
  scheduler?: SchedulerLike
): Observable<number>

range() vs from()

range() vs generate()

typescript
import { range } from 'rxjs';

// 1da5Vengono generati numeri sequenziali (1, 2, 3, 4, 5)
range(1, 5).subscribe({
  next: value => console.log('Valore:', value),
  complete: () => console.log('Completato')
});

// Uscita:
// Valore: 1
// Valore: 2
// Valore: 3
// Valore: 4
// Valore: 5
// Completato

Criteri di selezione:.

  • Richiede un numero sequenzialerange()
  • Enumera un valore qualsiasiof()
  • Promise esistentefrom()
  • Condizione complessa/passogenerare()

Note sulle prestazioni

range()` emette i valori in modo sincrono, quindi è necessario prendere nota delle prestazioni quando si generano un gran numero di valori.

WARNING

Gestione di grandi quantità di dati:.

typescript
function range(
  start: number,
  count?: number,
  scheduler?: SchedulerLike
): Observable<number>

dattiloscritto importare { range, from } da 'rxjs';.

// se sono richiesti numeri sequenziali → range() è conciso range(0, 10).subscribe(console.log);

// Non è necessario creare un array e poi convertirlo (inefficiente) from(Array.from({ length: 10 }, (_, i) => i)).subscribe(console.log);

// Se esiste un array esistente → usare from() const existingArray = [5, 10, 15, 20]; from(existingArray).subscribe(console.log);

typescript
function range(
  start: number,
  count?: number,
  scheduler?: SchedulerLike
): Observable<number>

dattiloscritto. import { range, of, map, catchError } from 'rxjs'; range(1, 10).pipe( map(n => { se (n === 5) { lancia un nuovo errore('Errore a 5'); } return n * 2; }),. catchError((error: unknown) => { const message = error of Error? error.message : String(error); console.error('Error occurred:', message); return of(-1); // restituisce il valore predefinito }) ).subscribe(console.log);.

// Output: 2, 4, 6, 8, -1

range()` è una semplice e potente Creation Function che produce una sequenza di numeri interi consecutivi.

IMPORTANT

Caratteristiche di range()`:. ✅ Ideale per generare numeri consecutivi (alternativa all'istruzione for).

  • ✅ Utile per l'elaborazione in batch, l'impaginazione e la generazione di dati di prova.
  • ✅ Efficiente dal punto di vista della memoria (nessuna creazione preliminare di array).
  • ⚠️ Considerare l'asincronia per grandi quantità di dati
  • ⚠️ Usare generate() per condizioni complesse

Vedere anche.

  • generate() - Generica generazione di loop.
  • of() - enumera valori arbitrari.
  • from() - Converte da un array o da Promise
  • interval() - Pubblica valori periodicamente

Risorsa di riferimento.

Pubblicato sotto licenza CC-BY-4.0.