如何解决使用CompletableFuture在Java 8中将JavaScript包装回叫为Promise
在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
中。我个人发现,在promises
中处理JavaScript
更容易,在java
中肯定更冗长。
在您的示例中,我看不到将匿名函数(response) => { resolve(response); }
传递到resolve
或promise
的{{1}}的意义,因为future
提供了CompletableFuture
方法来解析get()
,该方法在您的代码行之后被调用
CompletableFuture
CompletableFuture future = dataSubscriber.subscribeAsPromise(request).thenApply(response -> {
// handling response logic
});
// do this to "resolve" the future
future.get();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。