Один из способов - использовать рекурсивный подход.
Поэтому вы можете реализовать что-то вроде этого как удобную точку входа
private Future<YourResultType> callApiNTimes(final int repetitions) {
final Promise<YourResultType> p = Promise.promise();
recursiveApiCalls(p, 0, repetitions);
return p.future();
}
Рекурсия реализована следующим образом:
private void recursiveApiCalls(final Promise<YourResultType> p, final int counter, final int maxRepetitions) {
yourRawApiCall().onComplete(reply -> {
if (reply.failed()) {
p.fail(reply.cause());
return;
}
if (counter < maxRepetitions) {
recursiveApiCalls(p, counter + 1, maxRepetitions);
return;
}
p.complete(reply.result());
});
}
В конце реализовать yourRawApiCall
, а затем использовать его вот так
callApiNTimes(4).onComplete(reply -> {
if (reply.failed()) {
// Something went wrong, do your error handling..
return;
}
final YourResultType result = reply.result();
// Do something with your result..
});
Подход Antoher заключался бы в том, чтобы поместить ваши вызовы API как Futures в список и выполнить этот список параллельно с CompositeFuture.all , CompositeFuture.join , .. вместо одного за другим.