作為 Dart 開發人員,我們對異步編程和 Futures 的強大功能并不陌生。過去,當我們需要同時等待多個 future
時,我們依賴 Future.wait([])
方法,該方法返回一個 List<T>
。然而,這種方法有一個顯著的缺點:我們必須手動將結果轉換為所需的類型,這可能會導致代碼冗長且容易出錯。
final results = await Future.wait([Future.value("andrew"),Future.value(1984),
]);
expect((results[0] as String).toUpperCase(), "ANDREW");
expect((results[1] as int).isNegative, false);
幸運的是,有一個更優雅的解決方案,它利用了擴展和 async/await 語法的強大功能: zipWith
擴展方法。
介紹 zipWith
zipWith 擴展方法允許您將兩個 future
的結果組合成一個類型化元組,從而無需手動轉換。它的工作原理如下:
final (name, year) = await Future.value("andrew").zipWith(Future.value(1984));
expect(name.toUpperCase(), "ANDREW");
expect(year.isNegative, false);
在此示例中,我們將合并兩個 future
的結果:一個解析為字符串 “andrew”,另一個解析為整數 1984。該 zipWith
方法返回一個元組, (T, T2)
其中 T
是第一個未來的類型, T2
是第二個未來的類型。
但是等等,還有更多!您甚至可以鏈接多個 zipWith
調用來組合三個或更多 future
的結果:
final ((name, year), married) = await Future.value("andrew").zipWith(Future.value(1984)).zipWith(Future.value(false));
// ...
expect(married, false);
在此示例中,我們將三個 futures 組合在一起,從而生成一個嵌套元組 ((T, T2), T3)
。
引擎蓋下
那么,zipWith
是如何施展魔法的呢?下面是實現方法:
extension FutureZipX<T> on Future<T> {Future<(T, T2)> zipWith<T2>(Future<T2> future2) async {late T result1;late T2 result2;await Future.wait([then((it) => result1 = it),future2.then((it) => result2 = it)]);return (result1, result2);}
}
結束語
通過利用 zipWith
的強大功能,您可以在處理多個異步操作時編寫更簡潔、更具表現力的代碼。無需再手動轉換或擺弄 List<dynamic>
- 只需簡潔、類型安全的元組,使您的代碼更易于閱讀和維護。
因此,下次當您發現自己要兼顧多個 future
時,請嘗試一下 zipWith
,體驗 Dart 中簡化異步編程的樂趣。