我需要同時運行 4 個函式,但其??中一個函式根據用戶輸入而有所不同。
如果我使用“if-else”,我會因為 Future 而得到“if and else 有不兼容的型別”。
我看到的唯一方法是制作第三個函式,從其他兩個函式中進行選擇,但它不允許(據我所知)由于等待而同時運行。
另一種方法是進行兩個不同的連接!但這似乎“代碼昂貴”。
在這種情況下我該怎么辦?
tokio::join!(
self.func1(),
if self.flag() {
self.func2()
} else {
self.func3()
},
self.func4(),
self.func5()
);
函式簽名如下:
pub async fn funcN(&self) -> Result<Vec<String>> {
uj5u.com熱心網友回復:
您可以if在async塊內使用從兩個生成單個未來型別:
tokio::join!(
func1(),
async {
if flag() {
func2().await
} else {
func3().await
}
},
func4(),
func5()
);
這與其他答案的調度略有不同:flag()呼叫是未來的一部分,而不是立即運行。如果這是不可取的,您可以事先將布爾結果放入變數中。
除此之外,這很像這種Either方法,但可以推廣到兩個以上的選擇。
uj5u.com熱心網友回復:
可能最簡單的方法是使用Box動態調度。例如,這編譯:
tokio::join!(
func1(),
if flag() {
Box::pin(func2()) as Pin<Box<dyn Future<Output = _>>>
} else {
Box::pin(func3()) as Pin<Box<dyn Future<Output = _>>>
},
func4(),
func5()
);
操場
uj5u.com熱心網友回復:
您可以使用futures::future::Either列舉:
tokio::join!(
self.func1(),
if self.flag() {
Either::Left(self.func2())
} else {
Either::Right(self.func3())
},
self.func4(),
self.func5()
);
操場
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/414262.html
標籤:
