chrono杀死了我的Rust WebAssembly函数

chrono杀死了我的Rust WebAssembly函数,rust,webassembly,chrono,Rust,Webassembly,Chrono,程序员对Rust非常满意,所以我想试试。我有一个Hello World WebAssembly,我试图添加一些代码来显示时间 下面的行似乎终止了函数,但它不返回任何内容 (无文本,无错误) 设dt=Utc::now() 如果我注释掉该行,函数将像以前一样运行并返回一个字符串 这会发生在其他人身上吗? 我觉得奇怪的是,一种程序员如此喜欢的语言竟然会表现得如此令人讨厌 我的rs文件顶部有以下两行: 外部板条箱时钟; 使用计时::{持续时间,Utc} 我在toml文件的依赖项中有以下内容 chrono

程序员对Rust非常满意,所以我想试试。我有一个Hello World WebAssembly,我试图添加一些代码来显示时间

下面的行似乎终止了函数,但它不返回任何内容 (无文本,无错误)

设dt=Utc::now()

如果我注释掉该行,函数将像以前一样运行并返回一个字符串

这会发生在其他人身上吗? 我觉得奇怪的是,一种程序员如此喜欢的语言竟然会表现得如此令人讨厌

我的rs文件顶部有以下两行: 外部板条箱时钟; 使用计时::{持续时间,Utc}

我在toml文件的依赖项中有以下内容
chrono=“0.4”

要在WASM中使用,
chrono
必须使用
wasmbind
功能进行编译

然而,我在文档中找不到这个。此功能已被引用:

#[cfg(全部(target_arch=“wasm32”,而不是(target_os=“wasi”),feature=“wasmbind”)]
pub fn now()->DateTime{
现在就让我们来看看js_sys::Date::new_0();
日期时间:::从(现在)
}
此外,还有一个用于记录这种行为的开放窗口


您看到的这种行为有几个原因

  • 获取当前时间通常是标准库提供的函数。特别是,对于非WASM目标,
    chrono
    time
    板条箱调用
    get_time
    函数,然后该函数可以委托给
    libc
    或其他对象,具体取决于目标。然而,当您编译到WASM时,标准库相当有限——例如,没有系统调用,因此必须以其他方式提供一系列功能;特别是,前面提到的
    get_time
    函数是针对这个目标的,因此对它的任何调用都会死机
  • 库作者通常不希望您强制构建不需要的依赖项。特别是,如果某些依赖项(此处,
    js sys
    )仅对某些目标是必需的,则它将隐藏在功能标志后面,以便库(此处,
    chrono
    )的用户(例如Windows或Linux)不会不必要地提取它。这就是为什么您需要显式启用该功能,即使没有它,库也将无法在您的目标上使用
  • 最后一点信息是WASM中有限的错误处理:本质上,它在默认情况下唯一能做的就是在紧急情况下停止。这里可以提供一些帮助,如果添加到项目中,将在控制台窗口中显示“尚未实现”错误

  • 你的完整代码是什么。。?
    #[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)
    }