2 个不稳定版本
0.4.0 | 2024 年 7 月 31 日 |
---|---|
0.3.0 | 2024 年 7 月 31 日 |
#239 在 异步
每月 254 次下载
39KB
1K SLoC
Napi 扩展
此 crate 通过以下功能扩展了 napi-rs:
- 本地 futures 运行时
[napi_async]
宏用于本地 futures环境变量.spawn_local_promise()
环境变量.spawn_local()
JsPromise
JsRc
使用以下方式运行本地 futures:
use napi::*;
use napi_ext::*;
#[napi_async]
async fn my_js_func(env: Env, num: JsNumber) -> napi::Result<JsString> {
task::sleep(Duration::from_millis(1000)).await;
// Log number in JavaScript context
env.console_log(&[num])?;
// Returns Promise<String>
env.create_string("Hello World")
}
本地线程 futures
允许在 Rust 中使用异步通道、定时器和其他异步工具,而不会阻塞主 JavaScript 线程,同时保留与底层 JavaScript 值交互的能力。
安装
使用以下命令安装 crate:
cargo add napi_ext
示例
定时器与回调
use std::time::Duration;
use napi::*;
use napi_ext::*;
#[napi_derive::napi]
fn my_js_func(env: Env, callback: JsRc<JsFunction>) -> napi::Result<JsObject> {
env.spawn_local(move |env| async move {
task::sleep(Duration::from_millis(1000)).await;
callback.inner(&env)?.call_without_args(None)?;
Ok(())
})
}
import napi from './napi.node'
napi.myJsFunc(() => console.log('Waited for 1 second'))
通道与线程
您可以将操作系统线程与异步通道结合起来,以协调线程外的作业。
我建议使用 async_std 或 async-channel 作为异步工具,因为自定义 futures 反应器与 Tokio 工具不兼容。
use std::thread;
use std::time::Duration;
use napi::*;
use napi_ext::*;
use async_std::channel;
#[napi_derive::napi]
fn my_js_func(env: Env, callback: JsRc<JsFunction>) -> napi::Result<JsObject> {
let (tx, rx) = channel::unbounded();
thread::spawn(move || {
for i in 0..10 {
tx.send_blocking(i).unwrap();
thread::sleep(Duration::from_millis(1000));
}
});
env.spawn_local(move |env| async move {
while let Ok(value) = rx.recv().await {
println!("Got number: {}", value);
callback.inner(&env)?.call(None, &[env.create_int32(value)?])?;
}
Ok(())
})
}
开发
要设置开发环境,请确保您已安装 just
,然后运行
npm install
just run example-a
依赖关系
~1.5–7MB
~52K SLoC