kotlin多平台:如何在Javascript中使用kotlin流
我创建了一个kotlin多平台库来设计面向JVM和JS(nodejs和浏览器)的域层。域依赖于用例,用例依赖于存储库,存储库依赖于服务和数据库。另外,Kotlin协同程序跨平台工作(JS/JVM/Native) 我有一个返回kotlin多平台:如何在Javascript中使用kotlin流,javascript,java,android,kotlin,kotlin-multiplatform,Javascript,Java,Android,Kotlin,Kotlin Multiplatform,我创建了一个kotlin多平台库来设计面向JVM和JS(nodejs和浏览器)的域层。域依赖于用例,用例依赖于存储库,存储库依赖于服务和数据库。另外,Kotlin协同程序跨平台工作(JS/JVM/Native) 我有一个返回Flow的函数,而不是Promise fun getUserList() : Flow<List<User>>{...} fun getUserList():流{…} 原因是,我想在数据库发生任何更改时立即更新UI。在JVM(或Android)上,
Flow
的函数,而不是Promise
fun getUserList() : Flow<List<User>>{...}
fun getUserList():流{…}
原因是,我想在数据库发生任何更改时立即更新UI。在JVM(或Android)上,我知道如何使用流。但我不明白如何从普通Javascript(或TypeScript)(而不是Kotlin JS)中使用它。甚至我也没有找到任何支持文章来解释如何使用Flow for JS
有人能帮我解决这个问题吗?任何帮助都将不胜感激
PS:我的Javascript技能是中级的:p因此,在我找到这个问题的正式解决方案之前,以下是我的想法: 我没有返回流,而是创建了一个包含两个参数的包装函数:
@JsName("getUsersListWithUpdatesJs")
fun UserUseCase.getUsersListWithUpdatesJs(
success: (List<User>) -> Unit,
error: (Throwable) -> Unit
) = GlobalScope.promise {
try {
getUsersList().collect {
success(it)
}
} catch (exception: Throwable) {
error(exception)
}
}
如果流包含多个值,那么这将被打破,因为承诺只能解决一次。如果流只包含一个值,为什么要使用流而不是延迟值?@araqnid我明白你的意思了。但是我们会得到不止一个更新值,这就是我考虑使用Flow的原因。@araqnid承诺跟踪整个函数(和Flow集合)的完成情况。流的各个值是通过回调传递的,而不是通过承诺传递的,因此您提到的问题在这里不适用。这仍然有点奇怪,因为错误被传递到回调,然后承诺成功解决了。。感觉这个流应该适应一个可观察的环境,我认为
流
和挂起函数通常并不真正用于平台代码。因此,我想您使用回调的解决方案可能是唯一的:/
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);
}
);