Javascript使用CompletableFuture将回调包装为Java 8中的承诺等价物

Javascript使用CompletableFuture将回调包装为Java 8中的承诺等价物,javascript,java,promise,callback,completable-future,Javascript,Java,Promise,Callback,Completable Future,在Javascript中,我可以将回调包装为承诺,如下所示: 函数subscriptbeascalback(请求、回调){ //…异步操作 常数响应=。。。; 回调(响应); } 函数subscribeSpromise(请求){ 返回新承诺((解决、拒绝)=>{ SubscribeAscalBack(请求,(响应)=>{ 决心(回应); }); }); } 这样我就可以称之为 subscribespromise(请求)。然后(响应=>{ //处理响应逻辑 }); 我想问它在Java中的等价物

在Javascript中,我可以将回调包装为承诺,如下所示:

函数subscriptbeascalback(请求、回调){
//…异步操作
常数响应=。。。;
回调(响应);
}
函数subscribeSpromise(请求){
返回新承诺((解决、拒绝)=>{
SubscribeAscalBack(请求,(响应)=>{
决心(回应);
});
});
}
这样我就可以称之为

subscribespromise(请求)。然后(响应=>{
//处理响应逻辑
});
我想问它在Java中的等价物是什么?这是我在Java中的代码,我不知道如何包装回调

公共类数据订阅器{
public void subscriptbeascalback(请求,消费者){
//…异步操作
响应=。。。;
消费者接受(回应);
}
公开完整的未来订阅许可证(请求){
// ... ? 
//它的Java版本的等价物是什么?
}
}
这样我就可以按如下方式调用代码:

dataSubscriber.subscribespromise(请求)。然后apply(响应->{
//处理响应逻辑
});

我只是想到了一个使用
CountDownLatch
的解决方案,尽管我不认为使用CountDownLatch是一个好主意,因为它只是阻止线程执行,这会浪费一些资源。但这将是一个可能的解决方案

公共类数据订阅器{
public void subscriptbeascalback(请求,消费者){
//…异步操作
响应=。。。;
消费者接受(回应);
}
公共CompletableFuture subscribeAsPromise(请求){
返回CompletableFuture.SupplySync(()->{
试一试{
最终响应[]responeResult={null};
CountDownLatch闩锁=新的CountDownLatch(1);
SubscribeAscalBack(请求,新消费者(){
公共无效接受(响应){
ResponereResult[0]=响应;
倒计时();
}
});
satch.wait();
返回响应结果[0];
}捕获(例外情况除外){
抛出新的运行时异常(ex);
}
});
}
}

虽然代码看起来不是很好,但这是我能想到的第一个解决方案。希望还有其他更好的答案,以便我可以学习。

您将无法将
回调
传递到
CompletableFuture
。我个人觉得在
JavaScript
中更容易处理
承诺
,在
java
中肯定更详细

在您的示例中,我看不到将匿名函数
(response)=>{resolve(response);}
传递到
resolve
的意义,因为
CompletableFuture
提供了一个
get()
方法来解析
CompletableFuture
,这是在你的代码行之后调用的

CompletableFuture=dataSubscriber.subscribespromise(请求)。然后apply(响应->{
//处理响应逻辑
});
//这样做是为了“解决”未来
future.get();

公共类数据订阅器{
//请更新名称以反映正确的语义
公共响应SubscribeScalback(请求){
//…异步操作
响应=。。。;
返回响应;
}
公开完整的未来订阅许可证(请求){
返回CompletableFuture.SupplySync(this::SubscribeScalback);
}
}

也许我通过搜索找到的其中一个方法就是您想要的
runAsync()
?我如何使用runAsync()返回
CompletableFuture
?@CHANist将
subscribeScalback()
方法传递到
runAsync()
的lambda函数中。Example@codemax抱歉,仍然无法理解,您能给我一个更具体的例子吗?例如,如果我通过套接字请求数据,我可以使用回调轻松检索数据。肯定Promise只返回一次,而Socket可以返回很多次,但是如果我确保这样的契约确实存在,那么我可以使用Javascript中的Promise轻松地通过Socket包装回调(参见上面的代码)。但在Java中如何做到这一点呢?我认为我们需要更多的上下文和代码。例如,如果使用套接字,为什么还要创建一个
CompletableFuture
?数据不应该在事件处理程序中处理吗?