【问题标题】:kotlin-multiplatform : how to use Kotlin Flow in Javascriptkotlin-multiplatform : 如何在 Javascript 中使用 Kotlin Flow
【发布时间】:2020-05-06 02:44:29
【问题描述】:

我创建了一个 kotlin 多平台库来设计针对 JVM 和 JS(nodejs 和浏览器)的域层。 Domain 依赖于 UseCase,UseCase 依赖于 Repository,Repository 依赖于 Service 和 Database。 AFAIK,Kotlin Coroutines 跨平台工作(JS/JVM/Native)。

我有一个函数返回Flow,而不是Promise

fun getUserList() : Flow<List<User>>{...}

原因是,我想在数据库发生任何变化时立即更新 UI。在 JVM(或 Android)上,我知道如何使用 Flow。但是不明白如何从普通的 Javascript(或 TypeScript)(不是 Kotlin-JS)中使用它。甚至我也没有找到任何解释使用 Flow for JS 的支持文章。

谁能帮我解决这个问题?任何帮助将不胜感激!

PS:我的 Javascript 技能是中级 :P

【问题讨论】:

  • 我认为Flow 和挂起函数通常并不真正意味着平台代码使用。所以我猜你使用回调的解决方案可能是唯一的一个:/

标签: javascript java android kotlin kotlin-multiplatform


【解决方案1】:

所以,在我找到这个问题的官方解决方案之前,这是我想出的:

我没有返回 Flow,而是创建了一个带有两个参数的包装函数:

@JsName("getUsersListWithUpdatesJs")
fun UserUseCase.getUsersListWithUpdatesJs(
    success: (List<User>) -> Unit,
    error: (Throwable) -> Unit
) = GlobalScope.promise {
    try {
        getUsersList().collect {
            success(it)
        }
    } catch (exception: Throwable) {
        error(exception)
    }
}

然后我在我们的 Nexus 服务器上发布了 Js 库。

使用 npm 作为依赖添加到 JS 项目中。

那么,用法:

import * as domain from "my-multiplatform-library";
…
…
…
domain.com.abc.usecase.createUserUseCaseJs().then(
      (useCase) => {
        console.log(useCase);
        useCase. getUsersListWithUpdatesJs(
            (list) => {
                // This block should be called twice. For Empty and Non-empty array
                console.log("Response", list)
            },
            (error) => {
                // Ignore this block for now
            },
        );
      },
      (error) => {
        console.log(error);
      }
    );

【讨论】:

  • 如果流包含多个值,那么这将被破坏,因为承诺只能解决一次。如果流只包含一个值,为什么要使用 Flow 而不是 Deferred?
  • @araqnid 我明白你的意思。但是我们会得到不止一个值作为更新,这就是我考虑使用 Flow 的原因。
  • @araqnid 承诺用于跟踪整个功能(和流收集)的完成情况。流的各个值是通过回调传递的,而不是通过承诺,所以你提到的问题在这里不适用。
  • 啊,我看错界面了。还是有点奇怪,因为错误被传递给回调,然后promise就成功解决了。感觉Flow应该适应Observable
猜你喜欢
  • 2019-08-08
  • 1970-01-01
  • 2021-02-01
  • 2020-04-28
  • 2021-03-24
  • 2021-07-12
  • 2021-02-16
  • 2023-02-14
  • 2020-03-01
相关资源
最近更新 更多