Flutter 中使用Future消除Callback Hell

 


/先分别定义各个异步任务 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连名字都没改。接下来咱们看看经过Futureasync/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

相关文章
相关标签/搜索