1个不稳定版本

0.1.0 2024年5月19日

#2#js-value

MIT 许可证

48KB
923

有关更多信息,请参阅cargo doc上的文档。

构建

wasm-pack build --target web --release

该示例中包含一个简单示例,您可以使用示例文件夹中的miniserve查看。

cargo install miniserve
miniserve .

然后打开index.html


lib.rs:

这是一个针对JsValue的Send + Sync抽象。

它使得将JsValue包装在Arc中并与其他包装的JsValue一起使用成为可能。它还支持异步闭包并覆盖了一些特质操作。 它通过在单个线程上保留JsValue并将从其他线程发送的闭包执行在其上来实现这一点

这是创建包装值的示例

let js_v = JsArc::new(|| "Hello World!".into()).await;

js_v.with_self(|js_value| {
    web_sys::console::log_1(&js_value);
    js_value
})
.await;

在创建值之后,它们仍然可以更改

let js_v = JsArc::new(|| 2.into()).await;
js_v.with_self(|one| one + &5.into()).await;

// Outputs 7
js_v.with_self(|js_v| {
    web_sys::console::log_1(&js_v);
    js_v
})
.await;

这演示了创建两个JsValue并相互使用

let one = JsArc::new(|| 1.into()).await;
let two = JsArc::new(|| 2.into()).await;

let three = one
   .with_other(&two, |one, two| {
       let add_result: JsValue = &one + &two;

       (one, two, add_result)
   })
   .await;

three
   .with_self(|three| {
       web_sys::console::log_1(&three);

       three
   })
   .await;

它也适用于异步闭包

let js_v = JsArc::new(|| "Hello World!".into()).await;

js_v.with_self_async(|hello| async move {
    web_sys::console::log_1(&"Waiting 5 second then printing value".into());
    async_std::task::sleep(Duration::from_secs(5)).await;
    web_sys::console::log_1(&hello);

    hello
})
.await;

以及两个JsValue的异步闭包

let five = three
    .with_other_async(&two, |three, two| async {
        web_sys::console::log_1(&"Waiting 1 second then adding values".into());
        async_std::task::sleep(Duration::from_secs(1)).await;
        let add_result: JsValue = &three + &two;

        (three, two, add_result)
    })
    .await;

five.with_self(|five| {
    web_sys::console::log_1(&five);

    five
})
.await;

以及许多JsValue

let v0 = JsArc::new(|| 0.into()).await;
let v1 = JsArc::new(|| 1.into()).await;
let v2 = JsArc::new(|| 2.into()).await;
let v3 = JsArc::new(|| 3.into()).await;
let v4 = JsArc::new(|| 4.into()).await;

let ten = v0
    .with_many(vec![&v1, &v2, &v3, &v4], |mut all| {
        let [v0, v1, v2, v3, v4] = &all[..] else {
            unreachable!("Not possible");
        };

        let result = v0 + v1 + v2 + v3 + v4;

        all.push(result);
        all
    })
    .await; 

编写它的目的是简化跨不同线程使用JsValue。

// It works inside Arc so it can be used on different threads. JsValue does not support Send + Sync by itself.
let value_in_arc: Arc<JsArc> = Arc::new(three);
let str: Arc<JsArc> = JsArc::new(|| "hello!".into()).await.arc();

它还支持一些特质操作:加、按位与、按位或、按位异或、除、乘、取反、非、左移、右移、减

let three = (&one + &two).await;
let ten = (&(&three * &three).await + &one).await;
let seven = (&ten - &three).await;

seven
    .with_self(|seven| {
        web_sys::console::log_1(&seven);

        seven
    })
    .await;

警告

这尚未经过测试。此抽象的语法可以编译,但尚未在实际的多线程中测试。Rust WASM在2021版中默认不支持线程。在此未测试状态下,它可以用于传递Send + Sync的特质限制要求。在编写此代码时未使用不安全代码,并且实现对于线程环境应该是正确的。

依赖项

~1.3–3.5MB
~60K SLoC