【问题标题】:How to use AsyncGenerators with Kotlin/JS?如何在 Kotlin/JS 中使用 AsyncGenerators?
【发布时间】:2022-07-06 00:14:29
【问题描述】:

我目前正在尝试将 IPFS 与 Kotlin/JS 一起使用,尽管我的问题并不特定于此。 ipfs.cat()ipfs.get() 函数返回 AsyncGenerator,我不确定如何使用 Kotlin 对其进行迭代(我什至不确定哪种类型最能代表 Kotlin 中的 AsyncIterable)

下面的代码是我正在尝试做的最小版本,尽管我没有测试下面的代码。 由于 for 循环根本上是错误的,因此它会因 ClassCastException 而失败,但我不知道应该用什么替换它。

文件1:

@file:JsModule("ipfs-core")
@file:JsNonModule

import kotlin.js.Promise

@JsName("create")
external fun create(config: Any = definedExternally): Promise<dynamic>

文件2:

create().then { ipfs: dynamic ->
    ipfs.id().then { id: dynamic ->
        myId = id.id as String
        println(JSON.stringify(id))
    }
    val result: dynamic = ipfs.cat("bafkreihapp6racx2xf5gwnrgtsr56r37kazui3jvzzmot2nx2t6h6g2oom")
    // result is an AsyncGenerator

    // below fails with ClassCastException
    for (element: dynamic in result){
        println(element)
    }
}

【问题讨论】:

  • 您需要在 Kotlin 中定义所有外部类。因此,您将为要从特定 npm 模块使用的每种类型生成外部类。您是否尝试过使用 Dukat 为特定的 npm 模块生成外部类?

标签: javascript kotlin kotlin-multiplatform kotlin-js async-iterator


【解决方案1】:

这是我想出的解决方案: 我需要将所有内容移动到异步上下文中,然后手动迭代 AsyncGenerator:

                   val result: dynamic = ipfs.cat("bafkreihapp6racx2xf5gwnrgtsr56r37kazui3jvzzmot2nx2t6h6g2oom")
                   val resultArray = js("[]")
                   var cont: Boolean = true

                       while (cont) {
                           result.next().then { currentNext: dynamic ->
                               val value: dynamic = currentNext.value
                               val done: Boolean = currentNext.done
                               if (done) {
                                   println("done")
                                   cont = false
                               } else {
                                   println("got: ${currentNext.value}")
                                   resultArray.push(currentNext.value)
                               }
                           }
                       }
                       println(resultArray.joinToString("\n"))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-02
    • 1970-01-01
    • 2022-10-14
    • 1970-01-01
    • 2019-11-11
    • 2019-05-19
    相关资源
    最近更新 更多