iT邦幫忙

2022 iThome 鐵人賽

DAY 13
0
Mobile Development

關於 Flutter 開發的一些設計雜談系列 第 13

Day 13 - 非同步處理怎麼寫?有差嗎?

  • 分享至 

  • xImage
  •  

在開發 App 的過程中,我們的程式常常會需要與外部服務互動,例如:利用 http 像後端 API 拿回一些資料,或者把一些資料存到 Local storage 中。在這些情境中,我們無可避免地需要使用非同步來處理,因為這些互動往往需要一些時間,而我們不能讓程式因為等待結果而卡住。

使用 .then 處理

在非同步呼叫回傳 Future 後,我們可以呼叫 Future.then,並傳入我們想要的後續操作,來完成非同步處理。也可以繼續使用 .catchError 處理錯誤情況。

it_img_12_1.png
https://dartpad.dev/?id=631e48f94fc4932beb2f8d6ca0ffbd30

使用 async / await

除了使用 .then 之外,Dart 還提供 async/await 的方式來處理非同步。使用 async/await 來處理非同步的呼叫,可以把程式碼寫的與同步程式碼一樣,閱讀上非常直觀。而在錯誤處理的方面,能像同步程式碼一樣,使用 try / catch 處理。

it_img_12_2.png
https://dartpad.dev/?id=61b515070bef07ebb8d5694fca43af52

再看了 .then 和 async/await 的作法之後,大家可能會思考,到底用哪個比較好呢?

async/await 無法使用?

有些時候,我們不得不使用 .then:當我們在 StatefulWidget 中的 initState 裏,想呼叫非同步方法來初始化狀態時,由於 initState 本身回傳值 void,使得我們無法在其中使用 await。此時,我們必須使用 .then 來處理。

it_img_12_3.png
https://dartpad.dev/?id=50d3d9e4f54c6ec3047780ea4eec715f

雖然我們可以硬把 initState 加上 async,實際上執行卻會發生錯誤

it_img_12_4.png

使用 .then V.S. 使用 async/await

大多數時候,用 .then 或用 async/await 並不會差很多,但是我自己強烈推薦使用 async/await,原因如下

  1. 可讀性:async/await 讓寫法是一行一行的往下執行,也比較容易閱讀,上一行的非同步處理結果,可能在下一行就直接使用,省去 .then 與其 callback 參數的包裝,程式碼變得比較簡潔。
  2. 可拓展性:當我們今天需要循序的使用多個非同步呼叫時,.then 會變得十分複雜,從下面程式碼中,我們可以看出,隨著非同步呼叫數量越多,.then 寫法則越複雜,當再加上錯誤處理時,程式碼就變得幾乎無法理解。相反的,而 async/await 的作法能維持一行一個操作的寫法,使其維持一定的可讀性。

it_img_12_5.png
https://dartpad.dev/?id=fa2f7f3786ad656b894153e59a4a027b
https://dartpad.dev/?id=966b04b98c4b2a37ae09a3ffb928e65f

結論

非同步處理是開發過程中很常使用到的技巧之一,如果此時程式碼寫的不夠清楚,往往在實現時忽略執行邏輯而造成 Bug,當程式碼又不好讀時,更是雪上加霜。使用 async/await 能讓我們把非同步處理寫的像同步處理一樣,讓程式碼變得更好讀,也易於新手學習。


上一篇
Day 12 - 用 Nested Navigation 處理耦合的頁面
下一篇
Day 14 - 使用 Extension 偽裝成外部類別的方法
系列文
關於 Flutter 開發的一些設計雜談30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言