如何在flatMap中使用await方法?

时间:2018-04-05 23:35:57

标签: android kotlin rx-java kotlinx.coroutines rx-kotlin2

我的问题是这个。我有下一个代码

Observable.fromIterable(this)
            .flatMap { project ->
                val date = async(CommonPool) {
                    App.db.projectResponseDao().getLastUpdate(project.uid.toString())
                }
                val query = ProjectQuery.builder().id(project.uid.toString()).date(date.await()).build()
                val baseGraphQlUrl = context.getString(R.string.base_graphql_url)
                val apolloCall: ApolloCall<ProjectQuery.Data> = ApiClient.getApolloClient(context.getSessionToken(), baseGraphQlUrl).query(query)
                val remoteObservable: Observable<Pair<Project, Response<ProjectQuery.Data>>> = Observable.combineLatest(
                        Observable.just(project),
                        Rx2Apollo.from(apolloCall),
                        BiFunction { localProject, response -> Pair(localProject, response) })
                remoteObservable
            }

所以,我在Android应用程序中从Room表中获取日期。我使用异步方法,因为房间查询需要在与UI不同的线程中完成。因此,结果,我想为远程数据库构建一个新查询。问题是我想确保在创建查询时已经初始化了日期。考虑到这一点,我使用await方法,但给了我一个错误。它说我不能在无挂起功能中调用await函数。那么,你能想出解决这个问题的方法吗?或者如何修复它?谢谢

1 个答案:

答案 0 :(得分:1)

如果您要做的就是从主线程中取消您的房间呼叫,您可以在上面发布的代码末尾添加flatMap,在IO线程上运行.subscribeOn(Schedulers.io())代码。然后您不需要在flatMap内移动线程。

Observable.fromIterable(this)
      .flatMap { project->
      val date = App.db.projectResponseDao().getLastUpdate(project.uid.toString())
      val query = ProjectQuery.builder().id(project.uid.toString()).date(date).build()
      val baseGraphQlUrl = context.getString(R.string.base_graphql_url)
      val apolloCall: ApolloCall<ProjectQuery.Data> = ApiClient.getApolloClient(context.getSessionToken(), baseGraphQlUrl).query(query)
      val remoteObservable: Observable<Pair<Project, Response<ProjectQuery.Data>>> = Observable.combineLatest(
                        Observable.just(project),
                        Rx2Apollo.from(apolloCall),
                        BiFunction { localProject, response -> Pair(localProject, response) })
      remoteObservable
      }
      .subscribeOn(Schedulers.io())