浅析Dart语言的异步处理
async和await也支持异步编程/*返回值为Future String 类型,即其返回值未来是一个String类型的值*/ /*async关键字声明该函数内部有代码需要延迟执行*/ getData() async { /*await关键字声明运算为延迟执行,然后return运算结果*/ return await "This is a doubi"; }调用这个方法,并获取返回值。控制台居然报错
String data = getData();报错原因data是String类型,而函数getData()是一个异步操作函数,其返回值是一个await延迟执行的结果。在Dart中,有await标记的运算,其结果值都是一个Future对象,Future不是String类型,所以报错。总结一下:获取异步方法中直接 return await .. .时,实际上返回的是一个延迟计算的Future对象。两点需要注意:await关键字必须在async函数内部使用调用async函数必须使用await关键字
与JavaScript中的Promise非常相似,表示一个异步操作的最终完成(或失败)及其结果值的表示。
就是用于处理异步操作的,异步处理成功了就执行成功的操作,异步处理失败了就捕获错误或者停止后续操作。
Future表示一件 将来 会发生的事情,将来可以从Future中取到一个值。当一个方法返回一个Future时,发生两件事情:将某件事情排队,返回一个未完成的Future事情完毕之后,Future的状态会变成已完成,此时就可以取到这件事情的返回值。获取Future返回值,两种方式:
使用async配合await使用Future提供的api,其实就是用Future的then方法获取返回值void doAsyncs() async{ //then catchError whenComplete new Future(() = futureTask()) // 异步任务的函数 .then((m) = "1-:$m") // 任务执行完后的子任务 .then((m) = print('2-$m')) // 其中m为上个任务执行完后的返回的结果 .then((_) = new Future.error('3-:error')) .then((m) = print('4-')) .whenComplete(() = print('5-')) //不是最后执行whenComplete,通常放到最后回调 .catchError((e) = print('6-catchError:' + e), test: (Object o) { print('7-:' + o); return true; //返回true,会被catchError捕获 }) .then((_) = new Future.error('11-:error')) .then((m) = print('10-')) .catchError((e) = print('8-:' + e)) ; } futureTask() { return Future.delayed(Duration(seconds: 5),() = "9-走去跑步"); }执行结果
I/flutter: 2-1-:9-走去跑步
I/flutter: 5-
I/flutter: 7-:3-:error
I/flutter: 6-catchError:3-:error
I/flutter: 8-:11-:error
async/await和JavaScript中的async/await功能和用法是一样的。task() async { try{ String id = await login("alice","******"); String userInfo = await getUserInfo(id); await saveUserInfo(userInfo); //执行接下来的操作 } catch(e){ //错误处理 print(e); } }async用来表示函数是异步的定义的函数会返回一个Future对象,可以使用then方法添加回调函数。await 后面是一个Future表示等待该异步任务完成,异步完成后才会往下走;await必须出现在 async 函数内部。
Stream 同样是用于接收异步事件数据,和Future 的区别是,它可以接收多个异步操作的结果(成功或失败)。在执行异步任务时,可以通过多次触发成功或失败事件来传递结果数据或错误异常。Stream常用于会多次读取数据的异步任务场景,如网络内容下载、文件读写等:Stream.fromFutures([ // 1秒后返回结果 Future.delayed(new Duration(seconds: 1), () { return "hello 1"; }), // 抛出一个异常 Future.delayed(new Duration(seconds: 2),(){ throw AssertionError("Error"); }), // 3秒后返回结果 Future.delayed(new Duration(seconds: 3), () { return "hello 3"; })]).listen((data){ print(data);}, onError: (e){ print(e.message);},onDone: (){ print("完成");});依次会输出:
I/flutter (17666): hello 1
I/flutter (17666): Error
I/flutter (17666): hello 3
浅析Dart语言的异步处理