Я видел много других сообщений на эту тему, и прочитал официальную (см. Ниже) и полуофициальную документацию, такую как https://www.learnrxjs.io/operators/transformation/switchmap.html,, но я все еще не смог усвоить разницу между "map "и" switchMap ", и я надеюсь уточнить с конкретными примерами ниже.
Примечание в соответствии с официальной документацией RxJS:
Имея в виду мое неполное понимание, я сделал несколько очень простых примеров, см. StackBlitz https://stackblitz.com/edit/rxjs-xpicph?devtoolsheight=60,, но все еще не до конца понимаю, почему некоторые из примеровпроизводят продукцию, которую они делают, так, как они делают.
Во-первых, несколько очень простых string
примеров:
// String Example 1
const source = of('World').pipe(
map(x => `Hello ${x}!`)
);
source.subscribe(x => console.log(`SOURCE (map): ${x}`));
// SOURCE (map): Hello World!
Хорошо, достаточно справедливо, я думаю, что я в основном понимаю это.
- "Of" испускает "World" в качестве значения (или излучение все еще является наблюдаемым на этом этапе?) Для "pipe"
- "pipe" предоставляет "World" какзначение (или это все еще Observable?) для «сопоставления»
- «map» проецирует это (значение? Observable?) в «Hello World», ожидая завершения всех символов, и возвращает это (значение«Observable») для «pipe»
- «pipe» затем возвращает Observable.
Следовательно, мы получаем вывод: «Hello World»
// String Example 2
const otherSource = of('World').pipe(
switchMap(x => `Hello ${x}!`)
);
otherSource.subscribe(x => console.log(`SOURCE (switchMap): ${x}`));
// SOURCE (switchMap): H
// SOURCE (switchMap): e
// SOURCE (switchMap): l
// SOURCE (switchMap): l
// SOURCE (switchMap): o
// SOURCE (switchMap):
// SOURCE (switchMap): W
// SOURCE (switchMap): o
// SOURCE (switchMap): r
// SOURCE (switchMap): l
// SOURCE (switchMap): d
// SOURCE (switchMap): !
Вау! ИЗВИНИТЕ МЕНЯ? ЧТО ПРОСТО ПРОИЗОШЛО?
- "Of" испускает 'World' в качестве значения (или излучение все еще является наблюдаемым на этом этапе?) Для "pipe"
- "pipe" обеспечивает 'World 'как значение (или это все еще Observable?) Для "switchMap",
- "switchMap" проецирует это (значение? Observable?) В "Hello World", но в отличие от "map" недождаться завершения всех символов, прежде чем выводить в "трубу" серию наблюдаемых (или значений?), и будет ли это один наблюдаемый на символ? или это один Observable, который излучает один раз на каждого персонажа?
- "pipe" затем возвращает Observable для каждого символа?
ВОПРОС: Что именно здесь происходит под капотом, шаг за шагом в цепях выше?
Давайте перейдем к другому простому набору примеров, а затем, надеюсь,попробуйте связать все вместе:
// OBJECT EXAMPLES
const foo = {
"first": 1,
"second": 2
}
// OBJECT EXAMPLE 1
Object.keys(foo).forEach(obj=>of(foo[obj]).pipe(
map(x=>x*2)
).subscribe(x => console.log(`SOURCE (map): ${x}`)))
// SOURCE (map): 2
// SOURCE (map): 4
ОК, достаточно справедливо. Это кажется довольно простым
// OBJECT EXAMPLE 2
Object.keys(foo).forEach(obj=>of(foo[obj]).pipe(
switchMap(x=>of(x*2)) // WHY DO WE NEED ANOTHER "of()" HERE? "switchMap(x=>x*2)" DOESN'T COMPILE
).subscribe(x=> console.log(`SOURCE (switchMap): ${x}`)))
// SOURCE (switchMap): 2
// SOURCE (switchMap): 4
Достаточно ясно, но ПОЧЕМУ нам нужно предоставить «(x * 2) для« switchMap »? В STRING ПРИМЕРЕ 2« switchMap », казалось, излучал как сумасшедший и автоматическиобернуть его вывод как Observable (или «pipe» обернуть вывод как Observable?), но в любом случае, «switchMap» и «pipe» не нуждались ни в каких дополнительных «of ()» или какой-либо другой помощи для переноса вывода какObservable, но в OBJECT EXAMPLE 2 нам явно необходимо предоставить второй «of ()», чтобы убедиться, что выходные данные «switchMap» являются наблюдаемыми, иначе код не скомпилируется (но для «map»,нам не нужно предоставлять второе "of ()"). Опять же, шаг за шагом, почему разница?
Итак, подведем итог, я был бы чрезвычайно признателен, если кто-нибудь может объяснить:
- В какой момент (ы) в цепочке (ах) в приведенных выше примерах мы имеем дело со значениями (т. Е. Выбросами из наблюдаемых) и в каких точках с наблюдаемыми?
- Почему «switchMap» обеспечивает очевидный разборповедение, видимое в STRING EXAMPLE 2?
- Почему нам нужно предоставить "of ()" для switchMap в OBJECT EXAMPLE 2, а не в STRING EXAMPLE 2? (И, аналогично, почему «map» не требуется второй «()»?)
Заранее спасибо !!