Chrono导致我的Rust WebAssembly函数失效

6
我有一个 Hello World WebAssembly,并尝试添加一些代码来显示时间。 以下行似乎会使函数失效且不返回任何内容(无文本,无错误)。
let dt = Utc::now();

如果我注释掉这行代码,函数将像以前一样运行并返回一个字符串。
这种情况也发生在其他人身上吗?
我在我的rs文件顶部有以下两行代码:
extern crate chrono;
use chrono::{Duration, Utc};

我在Toml文件的依赖项中有以下内容:

chrono = "0.4"

3
你的完整代码是什么? - Kvothe
1个回答

8
要在WASM中使用,必须使用wasmbind特性编译chrono
然而,我没有在文档中找到这个特性。这个特性被引用在源代码中
#[cfg(all(target_arch = "wasm32", not(target_os = "wasi"), feature = "wasmbind"))]
pub fn now() -> DateTime<Utc> {
    let now = js_sys::Date::new_0();
    DateTime::<Utc>::from(now)
}

此外,还有一个问题需要记录这种行为。
你所看到的行为有几个原因。
  1. 获取当前时间通常是标准库提供的一个函数。特别地,在非WASM目标上,chrono会调用time crate中的get_time函数,然后根据目标代理到libc或其他东西。但是,当您编译为WASM时,标准库相当有限-例如,没有系统调用,因此必须以其他方式提供一堆功能;特别地,前面提到的get_time函数在此目标上明确未实现,因此对其任何调用都将导致恐慌。
  2. 库作者通常不希望您强制构建不需要的依赖项。特别地,如果某些依赖项(在这里,js-sys)仅适用于某些目标,则会隐藏在功能标志后面,以便库(在这里,chrono)的用户在Windows或Linux上不会不必要地拉取它。这就是为什么您需要显式启用该功能,即使没有它,库也无法在您的目标上使用。
  3. 最后一个信息是WASM中有限的错误处理:基本上,默认情况下它唯一能做的就是在恐慌时停止。console_error_panic_hook crate可以提供一些帮助,如果将其添加到项目中,则会在控制台窗口中显示“尚未实现”的错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接