В чем разница между concatMap и flatMap в RxJava

Кажется, что эти две функции очень похожи. Они имеют одинаковую подпись (принимая rx.functions.Func1> func), и их мраморные диаграммы выглядят точно так же. Не могу вставить здесь фотографии, но вот один для concatMap , а вот для flatMap . Кажется, есть некоторая тонкая разница в описании результирующего Observable, где тот, который создан в concatMap, содержит элементы, которые являются результатом конкатенации результирующих наблюдаемых, а тот, который создается в flatMap, содержит элементы, которые возникают в результате первого слияния результирующих наблюдаемых и испуская результат этого слияния.

Однако, эта тонкость совершенно неясна для меня. Может ли кто-нибудь лучше объяснить эту разницу и в идеале привести несколько примеров, иллюстрирующих эту разницу.

41
задан Maroun 11 July 2019 в 10:52
поделиться

1 ответ

В первую очередь, flatMap - то же как mergeMap в Rxjs. Таким образом, это - один беспорядок меньше. Таким образом, существует два observables..

1) o1: простой список объектов от (['Kitty', 'Donald', 'Batman'])

2) process_o1 (): process_o1 () является функцией, которая берет в качестве одного параметра 'объект' и делает что-то с ним и возвращает Заметное, которое на завершении испускает 'сделанный с [объектом]'.

o1.pipe(mergeMap(item => process_o1(item))).subscribe(data => {
console.log(data);
});

Здесь мы собираемся видеть:-, сделанный с Kity.

сделанный с Donald.

сделанный с Batman.

без любой гарантии, что Kitty приезжает перед Donald и Donald, прибывает перед Batman. Это вызвано тем, что, как только внешнее заметное испускает объект, внутреннее заметное подписано.

===, Но в случае concatMap:-

o1.pipe(concatMap(item => process_o1(item))).subscribe(data => {
console.log(data);
});

у Нас есть гарантия ниже sequence:-

, сделанного с Kity.

сделанный с Donald.

сделанный с Batman.

, поскольку с concatMap оператором внутреннее Заметное не подписано перед предыдущими внутренними Заметными возвратами.

внешнее заметное свободно просто идти вперед и испустить все его значения, но concatMap удостоверится, что имеет дело с каждым из тех значений один за другим и поддерживает порядок. Отсюда имя concatMap.

В затруднении, если Вы увлечены поддержанием порядка выполнения вещей, необходимо использовать concatMap. Но если Вы не заботитесь о порядке, можно продолжить mergeMap, который будет подписываться на весь внутренний Observables сразу и продолжать испускать значения как и когда они возвратятся.

0
ответ дан 26 November 2019 в 22:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: