оператор zip
может использоваться для связанных выбросов из нескольких источников, с той разницей, что он излучает только тогда, когда излучает каждый из его базовых источников.так что ...
- в случае, если есть два базовых источника,
zip
будет излучать в парах. - в случае наличия трех базовых источников
zip
будет излучать триплетами. - ... и т. Д.
, чтобы получить практический смыслиз того, что я имею в виду, вы можете обратиться к странице RxMarbles и поиграть с выбросами в двух верхних потоках, наблюдая за нижним потоком.
с этим пониманием вы можете использовать *Оператор 1018 * zip для объединения результатов ответов Message
, например:
Single.zip(firstRequest, secondRequest, (firstReply, secondReply) -> {
// ...do stuff with the replies and compose some result
// to be handled in onSuccess()
return firstReply.body().toString() + secondReply.body().toString();
})
.subscribe(
result -> {
System.out.println("## onSuccess(" + result + ")");
},
error -> {
System.err.println("## onError(" + error.getMessage() + ")");
}
);
, если при любой из доставок произошел сбой, то сработает обработчик onError
.onSuccess
будет запущено в противном случае.
, если, как вы упомянули, у вас есть большое количество запросов, которые вы хотели бы обработать одновременно, существует перегруженный вариант zip который принимает Iterable
источников.в вашем случае это может выглядеть примерно так:
final List<Single<Message<Object>>> requests = asList(firstRequest, secondRequest, ...);
Single.zip(requests, replies -> {
// ...do stuff with the array of replies
return null;
})
.subscribe(...);
надеюсь, это поможет!