[英]CompletableFuture.get() equivalent in 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); }
來resolve
的promise
或future
,因為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.