如何从挂起方法调用 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
(或 awaitFirstOrDefault
、awaitFirstOrElse
、awaitFirstOrNull
、awaitSingle
)
viewModelScope.launch {
val status = uploadService.uploadFile(request).awaitFirst()
}
我在服务中定义了以下方法
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
(或 awaitFirstOrDefault
、awaitFirstOrElse
、awaitFirstOrNull
、awaitSingle
)
viewModelScope.launch {
val status = uploadService.uploadFile(request).awaitFirst()
}