Return 另一个 CompletableFuture 中的 CompletableFuture 内的值和 return 那个未来
Return a value inside a CompletableFuture in another CompletableFuture and return that future
我想在另一个 CompletableFuture 和 return 那个未来的 CompletableFuture(在本例中为 clonedWorld)中获取一个值。这是我的代码,我被困在这里:
@Override
public CompletableFuture<SlimeWorld> asyncCloneWorld(String worldName, String newWorld) {
loadWorldAsync(worldName).whenComplete((slimeWorld, throwable) -> {
if (throwable != null || slimeWorld.isEmpty()) {
plugin.getLogger().log(Level.SEVERE, "Impossibile caricare il mondo template!", throwable);
return;
}
try {
SlimeWorld clonedWorld = slimeWorld.get().clone(newWorld, loader, true);
} catch (IOException | WorldAlreadyExistsException e) {
plugin.getLogger().log(Level.SEVERE, "Non è stato possibile clonare il mondo: " + worldName, e);
}
});
return ?;
}
你的问题是 whenComplete()
只接受一个 BiConsumer
作为参数,它不能处理 returned CompletableFuture
的结果——除非抛出异常.
如果您想更改结果(此处从类似 Optional<SlimeWorld>
或仅 SlimeWorld
或 null
的例外)使用的适当方法是 handle()
.因此,传递给 handle()
的 lambda 应该是 return 最终结果(克隆的世界或 null
)。
并且由于 CompletableFuture
是流利的 API,您可以 return 来自 asyncCloneWorld()
的 handle()
调用的结果:
public CompletableFuture<SlimeWorld> asyncCloneWorld(String worldName, String newWorld) {
return loadWorldAsync(worldName).handle((slimeWorld, throwable) -> {
if (throwable != null || slimeWorld.isEmpty()) {
plugin.getLogger().log(Level.SEVERE, "Impossibile caricare il mondo template!", throwable);
return null;
}
try {
return slimeWorld.get().clone(newWorld, loader, true);
} catch (IOException e) {
plugin.getLogger().log(Level.SEVERE, "Non è stato possibile clonare il mondo: " + worldName, e);
return null;
}
});
}
我想在另一个 CompletableFuture 和 return 那个未来的 CompletableFuture(在本例中为 clonedWorld)中获取一个值。这是我的代码,我被困在这里:
@Override
public CompletableFuture<SlimeWorld> asyncCloneWorld(String worldName, String newWorld) {
loadWorldAsync(worldName).whenComplete((slimeWorld, throwable) -> {
if (throwable != null || slimeWorld.isEmpty()) {
plugin.getLogger().log(Level.SEVERE, "Impossibile caricare il mondo template!", throwable);
return;
}
try {
SlimeWorld clonedWorld = slimeWorld.get().clone(newWorld, loader, true);
} catch (IOException | WorldAlreadyExistsException e) {
plugin.getLogger().log(Level.SEVERE, "Non è stato possibile clonare il mondo: " + worldName, e);
}
});
return ?;
}
你的问题是 whenComplete()
只接受一个 BiConsumer
作为参数,它不能处理 returned CompletableFuture
的结果——除非抛出异常.
如果您想更改结果(此处从类似 Optional<SlimeWorld>
或仅 SlimeWorld
或 null
的例外)使用的适当方法是 handle()
.因此,传递给 handle()
的 lambda 应该是 return 最终结果(克隆的世界或 null
)。
并且由于 CompletableFuture
是流利的 API,您可以 return 来自 asyncCloneWorld()
的 handle()
调用的结果:
public CompletableFuture<SlimeWorld> asyncCloneWorld(String worldName, String newWorld) {
return loadWorldAsync(worldName).handle((slimeWorld, throwable) -> {
if (throwable != null || slimeWorld.isEmpty()) {
plugin.getLogger().log(Level.SEVERE, "Impossibile caricare il mondo template!", throwable);
return null;
}
try {
return slimeWorld.get().clone(newWorld, loader, true);
} catch (IOException e) {
plugin.getLogger().log(Level.SEVERE, "Non è stato possibile clonare il mondo: " + worldName, e);
return null;
}
});
}