codecamp

Tauri Rust异步命令

在 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!')
)


Tauri Rust错误处理
Tauri Rust在命令中访问窗口
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

Tauri 指南

Tauri 特性

Tauri 插件

Tauri 应用程序接口

Tauri JavaScript/TypeScript

Tauri 命令行界面

Tauri 进程

Tauri 参考

Tauri WebView 版本

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }