分析
在许多语法中,回调处置惩罚异步使命是很常见的操纵,然而回调多了是一件很老火的变乱。Dart给了我们很友好的方式,可以允许我们写出和同步代码很像的异步代码。
1,Future
Future一个异步操纵的终极完成(或失败)及其效果值的表现。简朴来说,它就是用于处置惩罚异步操纵的,异步处置惩罚乐成了就实行乐成的操纵,异步处置惩罚失败了就捕捉错误大概克制后续操纵。一个Future只会对应一个效果,要么乐成,要么失败。Future 的全部API的返回值仍旧是一个Future对象,所以可以很方便的举行链式调用。
1.1 Future一些常用的方法
Future.then:吸收异步效果;
Future.catchError:如果异步使命发生错误,我们可以在catchError中捕捉错误;
Future.whenComplete:无论乐成或失败都会走到这里;
Future.wait:须要等待多个异步使命都实行竣事后才举行一些操纵;
Future.delayed(Duration(seconds: 2),(){ //return "hi world!"; throw AssertionError("Error");}).then((data){ //实行乐成会走到这里 print(data);}).catchError((e){ //实行失败会走到这里 print(e);}).whenComplete((){ //无论乐成或失败都会走到这里});Future.wait([ // 2秒后返回效果 Future.delayed(Duration(seconds: 2), () { return "hello"; }), // 4秒后返回效果 Future.delayed(Duration(seconds: 4), () { return " world"; })]).then((results){ print(results[0]+results[1]);}).catchError((e){ print(e);});2,async/await
async/await提供一种语法糖,使异步使命串行化,更有利于明白可读。
2.1 回调地狱(Callback Hell)
如果代码中有大量异步逻辑,而且出现大量异步使命依赖其他异步使命的效果时,一定会出现Future.then回调中套回调情况。过多的嵌套会导致的代码可读性降落以及堕落率进步,而且非常难维护,这个题目被形象的称为回调地狱(Callback Hell)。如下示例:
login("alice","******").then((id){ //登录乐成后通过,id获取用户信息 getUserInfo(id).then((userInfo){ //获取用户信息后生存 saveUserInfo(userInfo).then((){ //生存用户信息,接下来实行其他操纵 ... }); });})2.2 消除回调地狱
消除回调地狱,有2种方法:
- 1,使用Future消除Callback Hell:Future 的全部API的返回值仍旧是一个Future对象,所以可以很方便的举行链式调用” ,如果在then 中返回的是一个Future的话,该future会实行,实行竣事后会触发背面的then回调,如许依次向下,就制止了层层嵌套;
- 2,使用 async/await 消除 callback hell:async用来表现函数是异步的,界说的函数会返回一个Future对象,可以使用 then 方法添加回调函数。await 背面是一个Future,表现等待该异步使命完成,异步完成后才会往下走;await必须出如今 async 函数内部。
//使用Future消除Callback Helllogin("alice","******").then((id){ return getUserInfo(id);}).then((userInfo){ return saveUserInfo(userInfo);}).then((e){ //实行接下来的操纵 }).catchError((e){ //错误处置惩罚 print(e);});//使用 async/await 消除 callback helltask() async { try{ String id = await login("alice","******"); String userInfo = await getUserInfo(id); await saveUserInfo(userInfo); //实行接下来的操纵 } catch(e){ //错误处置惩罚 print(e); } }着实,async/await 只是一个语法糖,编译器或表明器终极都会将其转化为一个Future的调用链。
先就写这么多,下面就得边学习边总结,有什么不对的地方,欢迎留言讨论,谢谢! |