Tauri Rust异步命令
在 Tauri 中,异步函数以不会导致 UI 冻结或减速的方式执行繁重的工作是有益的。
异步命令使用async_runtime::spawn
在单线程上执行。不带 async 关键字的命令将在主线程上执行,除非使用 #[tauri::command(async)] 定义。
如果命令需要异步运行,只需将其声明为异步
即可。
使用 Tauri 创建异步函数时需要小心。目前,您不能简单地在异步函数的签名中包含借用的参数。此类类型的一些常见示例是 和 。此处跟踪此限制:https://github.com/tauri-apps/tauri/issues/2533 和解决方法如下所示。
&str
State<'_, Data>
使用借用类型时,必须进行其他更改。以下是您的两个主要选项:
选项 1:将类型(例如)转换为未借用的类似类型,例如 。这可能不适用于所有类型,例如 .&str
String
State<'_, 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!')
)