kotlin-multiplatform:如何在 Javascript 中使用 Kotlin Flow

kotlin-multiplatform : how to use Kotlin Flow in Javascript

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

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

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

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

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

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

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

我创建了一个带有两个参数的包装函数,而不是返回 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);
      }
    );