1个不稳定版本
0.1.0 | 2024年5月19日 |
---|
#2 在 #js-value
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