【问题标题】:How to use await method inside a flatMap?如何在 flatMap 中使用 await 方法?
【发布时间】:2018-09-15 21:49:42
【问题描述】:

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

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 方法,但是给了我一个错误。它说我不能在没有挂起函数中调用等待函数。那么,你能想出一个办法来解决这个问题吗?或如何解决?谢谢你

【问题讨论】:

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


    【解决方案1】:

    如果您想要做的只是让您的 Rooms 取消主线程,您可以通过在上面发布的代码末尾添加 .subscribeOn(Schedulers.io()) 让您的 flatMap 代码在 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())
    

    【讨论】:

    • 哦,当然,你是对的。我将对其进行测试并整理您的观点:D。一个小问题。想象一下,这张平面地图不是来自可观察的。假设来自 kotlin 的法线贴图。在那种情况下,你如何归档我试图做的事情?如何使用 await() 来实现这一点?
    • 代码需要在可挂起函数中(用suspend注释),或者在launchasync块内。
    猜你喜欢
    • 2019-06-14
    • 2019-05-28
    • 1970-01-01
    • 2021-06-21
    • 2019-02-08
    • 2019-03-15
    • 1970-01-01
    • 1970-01-01
    • 2019-07-22
    相关资源
    最近更新 更多