如何在 WASI 中使用 Rust 的 async/await 语法

如何解决如何在 WASI 中使用 Rust 的 async/await 语法

我想用 cargo-wasi 编译以下代码

// reqwest = { version = "0.11",features = ["json"] }
// tokio = { version = "1",features = ["full"] }

use std::collections::HashMap;

#[tokio::main]
async fn main() -> Result<(),Box<dyn std::error::Error>> {
    let resp = reqwest::get("https://httpbin.org/ip")
        .await?
        .json::<HashMap<String,String>>()
        .await?;
    println!("{:#?}",resp);
    Ok(())
}

尝试编译后,我收到以下错误,因为 mio doesn't currently support WASI

$ cargo wasi run
   Compiling mio v0.7.9
   Compiling parking_lot v0.11.1
   Compiling serde_json v1.0.64
   Compiling idna v0.2.2
error[E0432]: unresolved import `crate::sys::IoSourceState`
  --> /home/ducaale/.cargo/registry/src/github.com-1ecc6299db9ec823/mio-0.7.9/src/io_source.rs:12:5
   |
12 | use crate::sys::IoSourceState;
   |     ^^^^^^^^^^^^^^^^^^^^^^^^^ no `IoSourceState` in `sys`
... errors omitted

我做了一些研究,到目前为止我发现的 examples 都没有使用 async/await。有什么可以替换 tokio 以便我的代码在 WASI 中编译的吗?

解决方法

我尝试运行它,但似乎 reqwests crate 无法使用 Cargo wasi 或 wasm-pack 正确构建,因为它无法编译 mio(在本地编译时由 tokio 使用)。在 github 上有一些提到 reqwests 可以与 wasm 一起使用,但它还没有得到完全支持,我找不到太多关于如何使其工作的信息。 WASI 上的 HTTP 请求目前似乎还没有太多解决方案,但是 web-sys 可以用于通过 Node.js 或浏览器发出请求。

似乎 tokio 需要特定功能标志才能与 Web 程序集一起使用。这个问题在底部提到了同步和 rt 标志:https://github.com/tokio-rs/tokio/issues/1597 但为了也使用 #[tokio:main],您还需要“rt-multi-thread”和“macros”功能标志。

也可以使用 wasm bindgen 将未来转换为承诺,但这可能不适用于 WASI:https://rustwasm.github.io/wasm-bindgen/api/wasm_bindgen_futures/

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?