Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
kotlin多平台:如何在Javascript中使用kotlin流_Javascript_Java_Android_Kotlin_Kotlin Multiplatform - Fatal编程技术网

kotlin多平台:如何在Javascript中使用kotlin流

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)上,

我创建了一个kotlin多平台库来设计面向JVM和JS(nodejs和浏览器)的域层。域依赖于用例,用例依赖于存储库,存储库依赖于服务和数据库。另外,Kotlin协同程序跨平台工作(JS/JVM/Native)

我有一个返回
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);
      }
    );