How to call Observable from suspend method and wait for result

Viewed 671

I have following method defined in a service

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

What I want to do is invoke this method from suspend method what is the best way to invoke a Observable from suspend method and wait for results from 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()
}

I know, I could refactor above service to take out "fileUploadService.uploadFile" to method and invoke that directly. But I am trying to prototype RxJava Observable+Coroutine coexistence.

1 Answers

Using extension suspend fun <T> ObservableSource<T>.awaitFirst(): T from kotlinx.coroutines.rx3 (or awaitFirstOrDefault, awaitFirstOrElse, awaitFirstOrNull, awaitSingle)

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