Tauri Rust異步命令

2024-01-26 09:59 更新

在 Tauri 中,異步函數(shù)以不會導(dǎo)致 UI 凍結(jié)或減速的方式執(zhí)行繁重的工作是有益的。

異步命令使用 async_runtime::spawn 在單線程上執(zhí)行。不帶 async 關(guān)鍵字的命令將在主線程上執(zhí)行,除非使用 #[tauri::command(async)] 定義。

如果命令需要異步運(yùn)行,只需將其聲明為異步即可。

使用 Tauri 創(chuàng)建異步函數(shù)時需要小心。目前,您不能簡單地在異步函數(shù)的簽名中包含借用的參數(shù)。此類類型的一些常見示例是 和 。此處跟蹤此限制:https://github.com/tauri-apps/tauri/issues/2533  和解決方法如下所示。&strState<'_, Data>

使用借用類型時,必須進(jìn)行其他更改。以下是您的兩個主要選項(xiàng):

選項(xiàng) 1:將類型(例如)轉(zhuǎn)換為未借用的類似類型,例如 。這可能不適用于所有類型,例如 .&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)
}

選項(xiàng) 2:將返回類型包裝在 Result 中。這個有點(diǎn)難實(shí)現(xiàn),但應(yīng)該適用于所有類型。

使用 return type ,替換為要返回的類型,或者如果您不希望返回任何內(nèi)容,則替換為錯誤類型,以便在出現(xiàn)問題或不希望返回任何可選錯誤時返回。例如:Result<a, b>a()b()

  • Result<String, ()>返回一個 String,并且沒有錯誤。
  • Result<(), ()>不返回任何內(nèi)容。
  • 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 調(diào)用

由于從 JavaScript 調(diào)用命令已經(jīng)返回了一個 promise,因此它的工作方式與任何其他命令一樣:

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


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號