簡體   English   中英

在 Java 8 中使用 CompletableFuture 將 Javascript 包裝回調作為 Promise 等價物

[英]Javascript Wrapping Callback as Promise Equivalent in Java 8 using CompletableFuture

在 Javascript 中,我可以將回調包裝為承諾,如下所示:

function subscribeAsCallback(request, callback) {
    // ... async operation
    const response = ...; 
    callback(response); 
}

function subscribeAsPromise(request) {
    return new Promise((resolve, reject) => {
        subscribeAsCallback(request, (response) => {
            resolve(response);
        });
    });
}

這樣我就可以調用它

subscribeAsPromise(request).then(response => {
   // handling response logic
});

我想問一下Java中的等價物是什么? 這是我的 Java 代碼,我不知道如何包裝回調。

public class DataSubscriber {
    public void subscribeAsCallback(Request request, Consumer<Response> consumer) {
        // ... async operation 
        Response response = ...; 
        consumer.accept(response); 
    }

    public CompletableFuture<Response> subscribeAsPromise(Request request) {
        // ... ? 
        // what is the equivalent of its Java version?
    }
}

這樣我就可以按如下方式調用代碼:

dataSubscriber.subscribeAsPromise(request).thenApply(response -> {
   // handling response logic
});

我只是想到了一個使用CountDownLatch的解決方案,盡管我不認為使用 CountDownLatch 是一個好主意,因為它只是阻止線程執行,這會浪費一些資源。 但這將是一種可能的解決方案。

public class DataSubscriber {
    public void subscribeAsCallback(Request request, Consumer<Response> consumer) {
        // ... async operation 
        Response response = ...; 
        consumer.accept(response); 
    }

    public CompletableFuture<Response> subscribeAsPromise(Request request) {        
        return CompletableFuture.supplyAsync(() -> {
            try {
                final Response[] responeResult = { null }; 
                CountDownLatch latch = new CountDownLatch(1);
                subscribeAsCallback(request, new Consumer<Response>() {
                    public void accept(Response response) {
                        responeResult[0] = response;
                        latch.countDown(); 
                    }
                });

                latch.await();
                return responseResult[0]; 
            } catch (Exception ex) {
                throw new RuntimeException(ex);
            }
        });
    }
}

雖然代碼看起來不是很好,但這是我能想到的第一個解決方案。 希望有其他更好的答案,以便我可以學習。

您將無法將callback傳遞給CompletableFuture 我個人發現在JavaScript處理promises更容易,而在java肯定更冗長。

在您的示例中,我沒有看到傳入匿名函數(response) => { resolve(response); } (response) => { resolve(response); }resolvepromisefuture ,因為CompletableFuture提供get()方法來解決CompletableFuture ,這是你的代碼行之后調用

CompletableFuture future = dataSubscriber.subscribeAsPromise(request).thenApply(response -> {
   // handling response logic
});

// do this to "resolve" the future
future.get();

public class DataSubscriber {
    // Please update the name to reflect the correct semantic meaning
    public Response subscribeAsCallback(Request request) {
        // ... async operation 
        Response response = ...; 
        return response;
    }

    public CompletableFuture<Response> subscribeAsPromise(Request request) {
        return CompletableFuture.supplyAsync(this::subscribeAsCallback);
    }
}


暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM