Tauri Rust异步命令

2024-01-26 09:59 更新

在 Tauri 中,异步函数以不会导致 UI 冻结或减速的方式执行繁重的工作是有益的。

异步命令使用 async_runtime::spawn 在单线程上执行。不带 async 关键字的命令将在主线程上执行,除非使用 #[tauri::command(async)] 定义。

如果命令需要异步运行,只需将其声明为异步即可。

使用 Tauri 创建异步函数时需要小心。目前,您不能简单地在异步函数的签名中包含借用的参数。此类类型的一些常见示例是 和 。此处跟踪此限制:https://github.com/tauri-apps/tauri/issues/2533  和解决方法如下所示。&strState<'_, Data>

使用借用类型时,必须进行其他更改。以下是您的两个主要选项:

选项 1:将类型(例如)转换为未借用的类似类型,例如 。这可能不适用于所有类型,例如 .&strStringState<'_, Data>

例:

// Declare the async function using String instead of &str, as &str is borrowed and thus unsupported
#[tauri::command]
async fn my_custom_command(value: String) -> String {
  // Call another async function and wait for it to finish
  some_async_function().await;
  format!(value)
}

选项 2:将返回类型包装在 Result 中。这个有点难实现,但应该适用于所有类型。

使用 return type ,替换为要返回的类型,或者如果您不希望返回任何内容,则替换为错误类型,以便在出现问题或不希望返回任何可选错误时返回。例如:Result<a, b>a()b()

  • Result<String, ()>返回一个 String,并且没有错误。
  • Result<(), ()>不返回任何内容。
  • Result<bool, Error>返回布尔值或错误,如上面的“错误处理”部分所示。

例:

// Return a Result<String, ()> to bypass the borrowing issue
#[tauri::command]
async fn my_custom_command(value: &str) -> Result<String, ()> {
  // Call another async function and wait for it to finish
  some_async_function().await;
  // Note that the return value must be wrapped in `Ok()` now.
  Ok(format!(value))
}

从 JS 调用

由于从 JavaScript 调用命令已经返回了一个 promise,因此它的工作方式与任何其他命令一样:

invoke('my_custom_command', { value: 'Hello, Async!' }).then(() =>
  console.log('Completed!')
)


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号