1
vertx.setPeriodic(1000, id -> {
    //api call
    if (count == 4){
        vertx.cancelTime(id); 
    }
});

现在的问题是我不想修复 1000 毫秒的时间,我只想调用 api 4 次,然后使用最终的 api 响应进行进一步处理,请帮助。

4

1 回答 1

2

一种方法是使用递归方法。

因此,您可以实现这样的东西作为方便的入口点

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..
});

另一种方法是将您的 API 调用作为 Futures 放在一个列表中,并与CompositeFuture.allCompositeFuture.join等并行执行此列表,而不是一个接一个地执行。

于 2020-08-06T08:34:07.883 回答