fix: apply orDefault function when already completed

This commit is contained in:
2025-10-04 19:02:27 +01:00
parent 51fac28604
commit df1ee340dd
4 changed files with 21 additions and 8 deletions

View File

@@ -14,8 +14,8 @@ repositories {
} }
dependencies { dependencies {
compile 'dev.tommyjs:futur-api:2.5.0' compile 'dev.tommyjs:futur-api:2.5.1'
compile 'dev.tommyjs:futur-lazy:2.5.0' compile 'dev.tommyjs:futur-lazy:2.5.1'
} }
``` ```
### Gradle DSL ### Gradle DSL
@@ -25,8 +25,8 @@ repositories {
} }
dependencies { dependencies {
implementation("dev.tommyjs:futur-api:2.5.0") implementation("dev.tommyjs:futur-api:2.5.1")
implementation("dev.tommyjs:futur-lazy:2.5.0") implementation("dev.tommyjs:futur-lazy:2.5.1")
} }
``` ```
### Maven ### Maven
@@ -42,12 +42,12 @@ dependencies {
<dependency> <dependency>
<groupId>dev.tommyjs</groupId> <groupId>dev.tommyjs</groupId>
<artifactId>futur-api</artifactId> <artifactId>futur-api</artifactId>
<version>2.5.0</version> <version>2.5.1</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>dev.tommyjs</groupId> <groupId>dev.tommyjs</groupId>
<artifactId>futur-lazy</artifactId> <artifactId>futur-lazy</artifactId>
<version>2.5.0</version> <version>2.5.1</version>
</dependency> </dependency>
</dependencies> </dependencies>
``` ```

View File

@@ -6,7 +6,7 @@ plugins {
subprojects { subprojects {
group = 'dev.tommyjs' group = 'dev.tommyjs'
version = '2.5.0' version = '2.5.1'
apply plugin: 'java-library' apply plugin: 'java-library'
apply plugin: 'com.github.johnrengelman.shadow' apply plugin: 'com.github.johnrengelman.shadow'

View File

@@ -504,11 +504,12 @@ public abstract class AbstractPromise<T> implements Promise<T> {
@Override @Override
public @NotNull Promise<T> orDefault(@NotNull ExceptionalFunction<Throwable, T> function) { public @NotNull Promise<T> orDefault(@NotNull ExceptionalFunction<Throwable, T> function) {
PromiseFactory factory = getFactory();
return useCompletion(() -> { return useCompletion(() -> {
CompletablePromise<T> promise = createLinked(); CompletablePromise<T> promise = createLinked();
addDirectListener(promise::complete, e -> runCompleter(promise, () -> promise.complete(function.apply(e)))); addDirectListener(promise::complete, e -> runCompleter(promise, () -> promise.complete(function.apply(e))));
return promise; return promise;
}, getFactory()::resolve, getFactory()::error); }, factory::resolve, e -> supplySafe(() -> factory.resolve(function.apply(e)), factory::error));
} }
private static class DeferredExecutionException extends ExecutionException { private static class DeferredExecutionException extends ExecutionException {

View File

@@ -211,6 +211,18 @@ public final class PromiseTests {
assert res.get() == 10; assert res.get() == 10;
} }
@Test
public void testOrDefaultFunctionCompleted() {
CompletablePromise<Integer> promise = promises.unresolved();
promise.completeExceptionally(new IllegalStateException("Test"));
AtomicReference<Integer> res = new AtomicReference<>();
promise.orDefault(e -> {
assert e instanceof IllegalStateException;
return 10;
}).thenPopulateReference(res);
assert res.get() == 10;
}
@Test @Test
public void testOrDefaultError() { public void testOrDefaultError() {
CompletablePromise<Integer> promise = promises.unresolved(); CompletablePromise<Integer> promise = promises.unresolved();