|
@@ -21,30 +21,35 @@ import com.yanzhenjie.kalle.NetCancel
|
|
|
import kotlinx.coroutines.*
|
|
|
import kotlinx.coroutines.sync.Mutex
|
|
|
import kotlinx.coroutines.sync.withLock
|
|
|
+import java.util.concurrent.CancellationException
|
|
|
|
|
|
|
|
|
/**
|
|
|
- * 该函数将选择[deferredArray]中的Deferred执行[Deferred.await], 然后将返回最快的结果
|
|
|
+ * 该函数将选择[listDeferred]中的Deferred执行[Deferred.await], 然后将返回最快的结果
|
|
|
* 执行过程中的异常将被忽略, 如果全部抛出异常则将抛出最后一个Deferred的异常
|
|
|
*
|
|
|
- * @param deferredArray 一系列并发任务
|
|
|
+ * @param uid 指定该值将在成功返回结果后取消掉对应uid的网络请求
|
|
|
+ * @param listDeferred 一系列并发任务
|
|
|
*/
|
|
|
@OptIn(ExperimentalCoroutinesApi::class)
|
|
|
@Suppress("SuspendFunctionOnCoroutineScope")
|
|
|
-suspend fun <T> CoroutineScope.fastest(vararg deferredArray: Deferred<T>): T {
|
|
|
+suspend fun <T> CoroutineScope.fastest(
|
|
|
+ listDeferred: List<Deferred<T>>,
|
|
|
+ uid: Any? = null
|
|
|
+): T {
|
|
|
val deferred = CompletableDeferred<T>()
|
|
|
val mutex = Mutex()
|
|
|
- deferredArray.forEach {
|
|
|
+ listDeferred.forEach {
|
|
|
launch(Dispatchers.IO) {
|
|
|
try {
|
|
|
val result = it.await()
|
|
|
mutex.withLock {
|
|
|
- NetCancel.cancel(coroutineContext[CoroutineExceptionHandler])
|
|
|
+ NetCancel.cancel(uid)
|
|
|
deferred.complete(result)
|
|
|
}
|
|
|
} catch (e: Exception) {
|
|
|
it.cancel()
|
|
|
- val allFail = deferredArray.all { it.isCancelled }
|
|
|
+ val allFail = listDeferred.all { it.isCancelled }
|
|
|
if (allFail) deferred.completeExceptionally(e) else {
|
|
|
if (e !is CancellationException) e.printStackTrace()
|
|
|
}
|
|
@@ -54,91 +59,31 @@ suspend fun <T> CoroutineScope.fastest(vararg deferredArray: Deferred<T>): T {
|
|
|
return deferred.await()
|
|
|
}
|
|
|
|
|
|
-/**
|
|
|
- * 该函数将选择[deferredArray]中的Deferred执行[Deferred.await], 然后将返回最快的结果
|
|
|
- * 执行过程中的异常将被忽略, 如果全部抛出异常则将抛出最后一个Deferred的异常
|
|
|
- *
|
|
|
- * @param deferredArray 一系列并发任务
|
|
|
- */
|
|
|
-@OptIn(ExperimentalCoroutinesApi::class)
|
|
|
-@Suppress("SuspendFunctionOnCoroutineScope")
|
|
|
-suspend fun <T> CoroutineScope.fastest(deferredArray: List<Deferred<T>>): T {
|
|
|
- val deferred = CompletableDeferred<T>()
|
|
|
- val mutex = Mutex()
|
|
|
- deferredArray.forEach {
|
|
|
- launch(Dispatchers.IO) {
|
|
|
- try {
|
|
|
- val result = it.await()
|
|
|
- mutex.withLock {
|
|
|
- NetCancel.cancel(coroutineContext[CoroutineExceptionHandler])
|
|
|
- deferred.complete(result)
|
|
|
- }
|
|
|
- } catch (e: Exception) {
|
|
|
- it.cancel()
|
|
|
- val allFail = deferredArray.all { it.isCancelled }
|
|
|
- if (allFail) deferred.completeExceptionally(e) else {
|
|
|
- if (e !is CancellationException) e.printStackTrace()
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- return deferred.await()
|
|
|
-}
|
|
|
|
|
|
/**
|
|
|
- * 该函数将选择[deferredArray]中的Deferred执行[Deferred.await], 然后将返回最快的结果
|
|
|
+ * 该函数将选择[listDeferred]中的Deferred执行[Deferred.await], 然后将返回最快的结果
|
|
|
* 执行过程中的异常将被忽略, 如果全部抛出异常则将抛出最后一个Deferred的异常
|
|
|
*
|
|
|
* @see DeferredTransform 允许监听[Deferred]返回数据回调
|
|
|
- * @param deferredArray 一系列并发任务
|
|
|
- */
|
|
|
-@OptIn(ExperimentalCoroutinesApi::class)
|
|
|
-@Suppress("SuspendFunctionOnCoroutineScope")
|
|
|
-suspend fun <T, R> CoroutineScope.fastest(vararg deferredArray: DeferredTransform<T, R>): R {
|
|
|
- val deferred = CompletableDeferred<R>()
|
|
|
- val mutex = Mutex()
|
|
|
- deferredArray.forEach {
|
|
|
- launch(Dispatchers.IO) {
|
|
|
- try {
|
|
|
- val result = it.deferred.await()
|
|
|
- mutex.withLock {
|
|
|
- NetCancel.cancel(coroutineContext[CoroutineExceptionHandler])
|
|
|
- if (!deferred.isCompleted) {
|
|
|
- val transformResult = it.block(result)
|
|
|
- deferred.complete(transformResult)
|
|
|
- }
|
|
|
- }
|
|
|
- } catch (e: Exception) {
|
|
|
- it.deferred.cancel()
|
|
|
- val allFail = deferredArray.all { it.deferred.isCancelled }
|
|
|
- if (allFail) deferred.completeExceptionally(e) else {
|
|
|
- if (e !is CancellationException) e.printStackTrace()
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- return deferred.await()
|
|
|
-}
|
|
|
-
|
|
|
-/**
|
|
|
- * 该函数将选择[deferredList]中的Deferred执行[Deferred.await], 然后将返回最快的结果
|
|
|
- * 执行过程中的异常将被忽略, 如果全部抛出异常则将抛出最后一个Deferred的异常
|
|
|
*
|
|
|
- * @see DeferredTransform 允许监听[Deferred]返回数据回调
|
|
|
- * @param deferredList 一系列并发任务
|
|
|
+ * @param uid 指定该值将在成功返回结果后取消掉对应uid的网络请求
|
|
|
+ * @param listDeferred 一系列并发任务
|
|
|
*/
|
|
|
@JvmName("fastestTransform")
|
|
|
@OptIn(ExperimentalCoroutinesApi::class)
|
|
|
@Suppress("SuspendFunctionOnCoroutineScope")
|
|
|
-suspend fun <T, R> CoroutineScope.fastest(deferredList: List<DeferredTransform<T, R>>): R {
|
|
|
+suspend fun <T, R> CoroutineScope.fastest(
|
|
|
+ listDeferred: List<DeferredTransform<T, R>>,
|
|
|
+ uid: Any? = null
|
|
|
+): R {
|
|
|
val deferred = CompletableDeferred<R>()
|
|
|
val mutex = Mutex()
|
|
|
- deferredList.forEach {
|
|
|
+ listDeferred.forEach {
|
|
|
launch(Dispatchers.IO) {
|
|
|
try {
|
|
|
val result = it.deferred.await()
|
|
|
mutex.withLock {
|
|
|
- NetCancel.cancel(coroutineContext[CoroutineExceptionHandler])
|
|
|
+ NetCancel.cancel(uid)
|
|
|
if (!deferred.isCompleted) {
|
|
|
val transformResult = it.block(result)
|
|
|
deferred.complete(transformResult)
|
|
@@ -146,7 +91,7 @@ suspend fun <T, R> CoroutineScope.fastest(deferredList: List<DeferredTransform<T
|
|
|
}
|
|
|
} catch (e: Exception) {
|
|
|
it.deferred.cancel()
|
|
|
- val allFail = deferredList.all { it.deferred.isCancelled }
|
|
|
+ val allFail = listDeferred.all { it.deferred.isCancelled }
|
|
|
if (allFail) deferred.completeExceptionally(e) else {
|
|
|
if (e !is CancellationException) e.printStackTrace()
|
|
|
}
|