在将数据从 nodejs 传递到 rust 时使用 neon 执行异步任务

performing an async task using neon while passing data from nodejs to rust

我想使用 neon 执行从 nodejs 到 rust 的异步任务。 我想用一些数据从 nodejs 调用一个函数 performAsyncTask(data, (err, result) => {}) 并在 rust 完成任务后取回结果。

我查看了在他们的 github 上使用 neon 的基本异步示例:https://github.com/neon-bindings/examples/blob/main/async/native/src/lib.rs

不幸的是,我似乎无法弄清楚如何从 perform 方法访问数据 在后台任务中。

如果我通过这种方式获取从nodejs传入的参数 let arg0 = cx.argument::<JsValue>(0)?;,如何在 BackgroundTask 的执行方法中访问它?

感谢您的帮助!

谢谢!

由于这是异步执行的,因此在 perform_async_task() 返回之前结果不可用。在 javascript 中,您通常会向函数传递一个回调,然后在结果可用时调用该函数。 Neon 通过 .schedule() 方法为此提供了一个特定的快捷方式。

fn schedule(self, callback: Handle<'_, JsFunction>)

传递给 .schedule() 的回调将在任务完成后调用。有一个示例显示了这一点:https://github.com/neon-bindings/examples/blob/e7b5e3c4ed35f6c5d84895c2f7e7b06389989b6f/fibonacci-async-task/native/src/lib.rs

该示例同时显示了同步和异步实现。异步实现的关键部分是第 44 行,它获取从 JS 传入的回调参数,以及第 47 行将回调传递给 .schedule() 函数

43: let n = cx.argument::<JsNumber>(0)?.value() as usize;
44: let cb = cx.argument::<JsFunction>(1)?;
45: 
46: let task = FibonacciTask { argument: n };
47: task.schedule(cb);

根据任务实现中 .complete() 返回的值,其余的应该由 neon 自己处理