如何从挂起方法调用 Observable 并等待结果

How to call Observable from suspend method and wait for result

我在服务中定义了以下方法

fun uploadFile(
        fileName: String,
): Observable<Status> {
    return Observable.fromCallable {
        fileUploadService.uploadFile(
               fileName
        )
    }
    .subscribeOn(schedulerProvider.ioScheduler)
}

我想做的是从 suspend 方法调用这个方法,什么是从 suspend 方法调用 Observable 并等待 Observable 结果的最佳方式。

vieweModelScope.launch {
   coroutineScope {
        val deferredResults = async { uploadFileHelper(fileName) }
        val status = deferredResults.await()
   }
}

fun uploadFileHelper (fileName: String): Message {
        return uploadService.uploadFile(
                request = request,
            ).toBlocking().first()
}

我知道,我可以重构上述服务以取出“fileUploadService.uploadFile”方法并直接调用它。但是我正在尝试原型化 RxJava Observable+Coroutine 共存。

使用 kotlinx.coroutines.rx3 的扩展名 suspend fun <T> ObservableSource<T>.awaitFirst(): T(或 awaitFirstOrDefaultawaitFirstOrElseawaitFirstOrNullawaitSingle

viewModelScope.launch {
  val status = uploadService.uploadFile(request).awaitFirst()
}