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);
}
);
我创建了一个 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);
}
);