我的网站上有一个小游戏,我正在尝试实现一个排行榜。为此,我需要获取高分来与当前分数进行比较,然后在完成后发回更新的列表。
问题的要点是 wasm 缺乏异步选项。我知道像 wasm-bindgen-futures 这样的板条箱,但不确定如何在实践中实际使用它们。
fn get_scores() -> … {
let fut = reqwest::get(url);
let res = bevy::tasks::block_on(response); // crashes at runtime
let text = res.text(); // more async love needed here, omitted for brevity
let highscore = serde_json::from_str(text);
return highscore;
}
问题是 Rust 的类型系统要求值必须存在。现在,wasm-binden-futures 有
spawn_local
,但是
还可以选择使用 wasm-bindgen-futures 创建 JavaScript Promise,但我不确定这与 wasm 代码的交互效果如何。
future_to_promise
似乎它可能能够以我需要的方式协调信息,但似乎我仍然遇到“Rust 期望这里有一个值,但实际上没有。”的问题。
我曾考虑过完全用 JavaScript 处理数据请求,但我不确定如何将数据传回 Bevy wasm 应用程序 - 再次强调,不能保证它到时候会准备好我需要它。
这似乎是一个真正可以解决的问题:我需要来自服务器的一些数据,并且只有在玩家完成游戏后才需要它。我不一定需要阻止(无论如何,这是不可能的,我已经了解到),因为我不需要立即数据。除了类型系统要求该值存在之外。我的程序在不阻塞的情况下暂停执行并让浏览器在等待时执行其他工作也是完全可以接受的,但我不知道如何在没有异步运行时的情况下做到这一点。
我想知道是否有一种方法可以使用 Bevy 的事件循环来自己重复轮询 future。我只是对异步 Rust 不够熟练(阅读:一点也不),无法解决这样的问题。
如果你想在浏览器中运行 wasm,你可以使用
wasm-bindgen/web-sys
。这是reqwest
建议的;仅当您不针对浏览器时,reqwest
对 wasm
运行时的支持有限。
所以使用浏览器提供的 fetch API 会更容易。这是一个示例。