1

我正在尝试转换如下所示的阻塞 Play 框架控制器操作:

public Result testSync(String param1, String param2) {

    String result1 = <LONG-DB-QUERY>;
    if (result1 == null) {
        return internalServerError();
    }

    if (result1.equals("<SOME VALUE>")) {
        return ok(param1);
    }

    String result2 = <LONG-DB-QUERY>;
    return ok(result1 + result2);
}

使用接口进入非阻塞代码Future,即返回一个CompletionStage<Result>

如您所见,我同时需要result1result2。我假设我不能使用supplyAsync并且thenCombine因为result2只在某些情况下才需要计算。

4

1 回答 1

1

好的,基于类似的答案,这就是我设法做到这一点的方式:

public CompletionStage<Result> testAsync(String param1, String param2) {

    CompletableFuture<Result> shortCut = new CompletableFuture<>();
    CompletableFuture<String> withChain = new CompletableFuture<>();

    CompletableFuture.runAsync(() -> {
        String result1 = <LONG-DB-QUERY>;
        if (result1 == null) {
            shortCut.complete(internalServerError());
            return;
        }

        if (result1.equals("<SOME VALUE>")) {
            shortCut.complete(ok(param1));
            return;
        }

        withChain.complete(result1);
    });

    return withChain
            .thenCombine(CompletableFuture.supplyAsync(() -> <LONG-DB-QUERY>), (newParam1, newParam2) -> ok(result1+result2))
            .applyToEither(shortCut, Function.identity());
}
于 2018-03-14T23:38:53.863 回答