Во-первых, flatMap - это то же самое, что mergeMap в Rxjs. Так что это на одну путаницу меньше. Итак, есть две наблюдаемые ..
1) o1: простой список предметов из (['Китти', 'Дональд', 'Бэтмен'])
2) process_o1 (): process_o1 () - это функция, которая принимает в качестве одного параметра «элемент» и что-то делает с ним, а также возвращает Observable, который по завершении выдает «выполнено с помощью [элемент]».
o1.pipe(mergeMap(item => process_o1(item))).subscribe(data => {
console.log(data);
});
Здесь мы увидим: - С Кити покончено.
с Дональдом покончено.
сделано с Бэтменом.
без всякой гарантии, что Китти появится раньше Дональда, а Дональд появится перед Бэтменом. Это потому, что, как только внешний наблюдаемый объект испускает элемент, подписывается внутренний наблюдаемый объект.
=== Но в случае concatMap: -
o1.pipe(concatMap(item => process_o1(item))).subscribe(data => {
console.log(data);
});
У нас есть гарантия следующей последовательности: -
с Кити покончено.
с Дональдом покончено.
сделано с Бэтменом.
Поскольку с оператором concatMap внутренний Observable не подписывается до возврата предыдущего внутреннего Observable.
Внешняя наблюдаемая может просто продолжить и выдать все свои значения, но concatMap будет следить за тем, чтобы она обрабатывала каждое из этих значений одно за другим и поддерживала порядок. Отсюда и название concatMap.
В сущности, если вы хотите поддерживать порядок выполнения вещей, вам следует использовать concatMap. Но если вас не волнует порядок, вы можете продолжить с mergeMap, который будет подписываться на все внутренние Observables сразу и продолжать испускать значения по мере их возврата.
person
Ashish Mishra
schedule
15.11.2019