【问题标题】:Waiting on fetch() in Kotlin JS?在 Kotlin JS 中等待 fetch()?
【发布时间】:2020-09-06 14:01:19
【问题描述】:
我正在用 Kotlin JS 编写一个 WebGL 应用程序,因此我需要获取 .obj 文件和着色器等资源。我想通过 HTTP 请求执行此操作,但遇到了问题。
我目前正在尝试通过 JS 的 fetch() API 来执行此操作。问题是这显然是异步的,并且在渲染循环开始之前获取资源需要完成(即获取资源是初始化)。
我真的很难让它同步工作。也就是说,我的程序在获取着色器和 .obj 文件之前不应继续加载缓冲区和主绘制循环。我怎样才能让它在 Kotlin JS 中工作? fetch() 不是正确的做法吗?
【问题讨论】:
标签:
javascript
kotlin
kotlin-js
【解决方案1】:
我不确定fetch(),但 Ktor 带有一个多平台 HTTP 库,您可以立即使用它。你可以找到它here。
此类调用的示例如下所示:
suspend fun sequentialRequests() {
val client = HttpClient()
// Get the content of an URL.
val firstBytes = client.get<ByteArray>("https://127.0.0.1:8080/a")
// Once the previous request is done, get the content of an URL.
val secondBytes = client.get<ByteArray>("https://127.0.0.1:8080/b")
client.close()
}
【解决方案2】:
如果你想使用 fetch,你可以这样做。
import kotlinx.browser.window
import kotlinx.coroutines.*
import kotlin.js.Promise
suspend fun main() {
val promise = Promise.resolve(window.fetch("https://jsonplaceholder.typicode.com/todos/1").then {response->
response.json()
}.then {
it
}).await()
console.log(JSON.stringify(promise))}
肯定还有其他选择。如果这不适合你,请告诉我。
祝你好运!