BACK
Уроки7. of(array) vs from(array)
Уроки · 07

7. of(array) vs from(array)

Одинаковый массив — разные потоки

Это классическая ловушка, в которую попадает почти каждый новичок RxJS. Передадим один и тот же массив в of и в from и посмотрим, что получится.

of со скобками или без

of([1, 2, 3])
// next([1, 2, 3]) → complete()
// один сигнал, в котором лежит весь массив

from([1, 2, 3])
// next(1) → next(2) → next(3) → complete()
// три отдельных сигнала

Запомните правило: of отправляет аргумент «как есть», не разбирая его на части. from распаковывает входную структуру (массив, Promise, iterable) на элементы.

Признак ошибки

Если в подписке вы вдруг получили массив там, где ждали отдельные элементы, — почти наверняка вы вызвали of(array) вместо from(array).

Что нужно сделать

  1. Замените Rx.EMPTY у wholeArray$ на of(items). Первый подписчик получит один массив целиком и склеит его через '-'.
  2. Замените Rx.EMPTY у items$ на from(items). Второй подписчик получит три отдельных значения.
  3. Ожидаемый вывод:
    Whole: x-y-z
    Item: x
    Item: y
    Item: z
Решение spoiler · click to reveal
const { of, from } = Rx;

const items = ['x', 'y', 'z'];

const wholeArray$ = of(items);
const items$ = from(items);

wholeArray$.subscribe(value => {
  console.log('Whole: ' + value.join('-'));
});

items$.subscribe(value => {
  console.log('Item: ' + value);
});
script.ts // TypeScript
CONSOLE · Console Output
Нажмите на запуск, чтобы увидеть результат...