- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的应用程序中,我有 3 个 future 调用,这些调用是并行完成的,当收到其中一个调用的响应时,我还有另外 3 个请求,所有这些请求都应该在继续执行代码之前完成,正是 DeferredResult
来自 spring。
过了一段时间,我意识到页面有时会在后 3 个请求完成之前呈现。原始源代码(为简单起见省略逻辑):
public DeferredResult<String> someControllerMethod() {
DeferredResult<String> result = new DeferredResult();
CompletableFuture.allOf(
future1(),
future2(),
future3()
)
.whenComplete((aVoid, throwable) -> result.setResult("something"));
return result;
}
public CompletableFuture<?> future3() {
return someService.asyncCall()
.thenApplyAsync(response -> {
....
return CompletableFuture.allOf(
future4(),
future5(),
future6()
);
}
);
}
使用 thenApplyAsync
有时 DeferredResult
在实际 future 之前完成,而更改为 thenComposeAsync
似乎可以解决问题。有人可以解释一下为什么吗?或者这是我的代码中某处的错误,它不应该这样做?
最佳答案
thenApply[Async]
接受计算结果为任意值的函数。一旦返回该值, future 将用该值完成。当函数(就像在代码中一样)返回另一个 future 时,这不会为其添加额外的含义,future 将是结果值,无论是否完成,就像任何其他对象一样。
事实上,你的
public CompletableFuture<Void> future3() {
return someService.asyncCall()
.thenApplyAsync(response -> {
....
return CompletableFuture.allOf(
future4(),
future5(),
future6()
);
}
);
}
该方法甚至无法编译,结果是 CompletableFuture<CompletableFuture<Void>>
,一个结果值是另一个 future 的 future 。不发现错误的唯一方法是使用更广泛的类型,例如CompletableFuture<Object>
或CompletableFuture<?>
,作为 future3()
的返回类型.
相比之下,thenCompose[Async]
期望一个函数能够评估另一个 future ,准确地达到您期望的结果。这是“应用”和“撰写”之间的根本区别。如果您保留具体的CompletableFuture<Void>
future3()
的返回类型,编译器已经引导您使用“compose”,因为只有这样才会被接受。
public CompletableFuture<Void> future3() {
return someService.asyncCall()
.thenComposeAsync(response -> {
....
return CompletableFuture.allOf(
future4(),
future5(),
future6()
);
}
);
}
关于java - 需要解释,带有嵌套 allOf 的 applyAsync 将 CompletionStage 视为已完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48706612/
关于范围的 Angular 初学者问题( docs here )。 $eval在作用域的上下文中执行表达式。 $apply基本上是打电话$eval然后 $digest . 为什么$evalAsync调
$evalAsync 和 $applyAsync 之间有什么区别?我的理解是,当我从指令中使用 $evalAsync 时,表达式将在浏览器呈现之前进行计算。 举个例子,如果我想滚动到页面上的特定位置但
调用 $scope.$apply 而不是 $applyAsync 的用例是什么?我可能遗漏了一些东西,但后者似乎是前者的更安全版本,所以你无法获得摘要重入。 最佳答案 $scope.$apply 将尝
我使用套接字并从服务器获取大量消息。每个套接字消息都有一个处理程序,我在每个处理程序中调用 $apply 。如果有大量消息,使用 $applyAsync 而不是 $apply 是否会提高性能?如果是,
本文整理了Java中com.netflix.zuul.filters.ZuulFilter.applyAsync()方法的一些代码示例,展示了ZuulFilter.applyAsync()的具体用法。
在我的应用程序中,我有 3 个 future 调用,这些调用是并行完成的,当收到其中一个调用的响应时,我还有另外 3 个请求,所有这些请求都应该在继续执行代码之前完成,正是 DeferredResul
我是一名优秀的程序员,十分优秀!