Уроки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).
Что нужно сделать
- Замените
Rx.EMPTYуwholeArray$наof(items). Первый подписчик получит один массив целиком и склеит его через'-'. - Замените
Rx.EMPTYуitems$наfrom(items). Второй подписчик получит три отдельных значения. - Ожидаемый вывод:
Whole: x-y-zItem: xItem: yItem: 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
CONSOLE · Console Output
Нажмите на запуск, чтобы увидеть результат...