/先分別定義各個異步任務 Future<String> login(String userName, String pwd){ ... //用戶登陸 }; Future<String> getUserInfo(String id){ ... //獲取用戶信息 }; Future saveUserInfo(String userInfo){ ... // 保存用戶信息 }; 接下來,執行整個任務流: login("alice","******").then((id){ //登陸成功後經過,id獲取用戶信息 getUserInfo(id).then((userInfo){ //獲取用戶信息後保存 saveUserInfo(userInfo).then((){ //保存用戶信息,接下來執行其它操做 ... }); }); })
能夠感覺一下,若是業務邏輯中有大量異步依賴的狀況,將會出現上面這種在回調裏面套回調的狀況,過多的嵌套會致使的代碼可讀性降低以及出錯率提升,而且很是難維護,這個問題被形象的稱爲回調地獄(Callback Hell)。回調地獄問題在以前JavaScript中很是突出,也是JavaScript被吐槽最多的點,但隨着ECMAScript6和ECMAScript7標準發佈後,這個問題獲得了很是好的解決,而解決回調地獄的兩大神器正是ECMAScript6引入了Promise
,以及ECMAScript7中引入的async/await
。 而在Dart中幾乎是徹底平移了JavaScript中的這二者:Future
至關於Promise
,而async/await
連名字都沒改。接下來咱們看看經過Future
和async/await
如何消除上面示例中的嵌套問題。異步
login("alice","******").then((id){ return getUserInfo(id); }).then((userInfo){ return saveUserInfo(userInfo); }).then((e){ //執行接下來的操做 }).catchError((e){ //錯誤處理 print(e); });
正如上文所述, 「Future
的全部API的返回值仍然是一個Future
對象,因此能夠很方便的進行鏈式調用」 ,若是在then中返回的是一個Future
的話,該future
會執行,執行結束後會觸發後面的then
回調,這樣依次向下,就避免了層層嵌套。async