diff --git a/platform/platform-tests/testSrc/org/jetbrains/concurrency/AsyncPromiseTest.kt b/platform/platform-tests/testSrc/org/jetbrains/concurrency/AsyncPromiseTest.kt index c7c7841b9bf7..3e28d71918c8 100644 --- a/platform/platform-tests/testSrc/org/jetbrains/concurrency/AsyncPromiseTest.kt +++ b/platform/platform-tests/testSrc/org/jetbrains/concurrency/AsyncPromiseTest.kt @@ -19,6 +19,7 @@ import com.intellij.testFramework.assertConcurrent import org.assertj.core.api.Assertions.assertThat import org.assertj.core.api.Assertions.assertThatThrownBy import org.junit.Test +import java.util.concurrent.TimeUnit import java.util.concurrent.TimeoutException import java.util.concurrent.atomic.AtomicInteger @@ -48,7 +49,7 @@ class AsyncPromiseTest { val numThreads = 30 assertConcurrent(*Array(numThreads, { - if (it and 1 === 0) r else s + if ((it and 1) == 0) r else s })) assertThat(count.get()).isEqualTo(numThreads / 2) @@ -69,6 +70,13 @@ class AsyncPromiseTest { }) } + @Test + fun `ignoreErrors`() { + val a = resolvedPromise("foo") + val b = rejectedPromise() + assertThat(collectResults(listOf(a, b), ignoreErrors = true).blockingGet(100, TimeUnit.MILLISECONDS)).containsExactly("foo") + } + @Test fun blockingGet2() { val promise = AsyncPromise() diff --git a/platform/projectModel-api/src/org/jetbrains/concurrency/promise.kt b/platform/projectModel-api/src/org/jetbrains/concurrency/promise.kt index 56851f141d5f..1cedd059c493 100644 --- a/platform/projectModel-api/src/org/jetbrains/concurrency/promise.kt +++ b/platform/projectModel-api/src/org/jetbrains/concurrency/promise.kt @@ -1,5 +1,5 @@ /* - * Copyright 2000-2016 JetBrains s.r.o. + * Copyright 2000-2017 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -116,7 +116,8 @@ inline fun Promise<*>.rejected(node: Obsolescent, crossinline handler: (Throwabl override fun consume(param: Throwable) = handler(param) }) -fun collectResults(promises: List>): Promise> { +@JvmOverloads +fun collectResults(promises: List>, ignoreErrors: Boolean = false): Promise> { if (promises.isEmpty()) { return resolvedPromise(emptyList()) } @@ -125,7 +126,7 @@ fun collectResults(promises: List>): Promise> { for (promise in promises) { promise.done { results.add(it) } } - return all(promises, results) + return all(promises, results, ignoreErrors) } @JvmOverloads @@ -187,7 +188,8 @@ fun ActionCallback.toPromise(): Promise { fun all(promises: Collection>): Promise<*> = if (promises.size == 1) promises.first() else all(promises, null) -fun all(promises: Collection>, totalResult: T?): Promise { +@JvmOverloads +fun all(promises: Collection>, totalResult: T?, ignoreErrors: Boolean = false): Promise { if (promises.isEmpty()) { @Suppress("UNCHECKED_CAST") return DONE as Promise @@ -195,7 +197,7 @@ fun all(promises: Collection>, totalResult: T?): Promise { val totalPromise = AsyncPromise() val done = CountDownConsumer(promises.size, totalPromise, totalResult) - val rejected = Consumer { error -> totalPromise.setError(error) } + val rejected = if (ignoreErrors) Consumer { done.consume(null) } else Consumer { totalPromise.setError(it) } for (promise in promises) { promise.done(done)