Dart简介4--异步支持

计算机软件开发 2024-9-26 17:48:54 35 0 来自 中国
分析

在许多语法中,回调处置惩罚异步使命是很常见的操纵,然而回调多了是一件很老火的变乱。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的调用链。
先就写这么多,下面就得边学习边总结,有什么不对的地方,欢迎留言讨论,谢谢!
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-11-24 11:20, Processed in 0.175353 second(s), 32 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表