Future 是在未来某个时间获得想要对象的一种手段。
Dart下的Future类似于ES6下新增的Promise,也是为了解决异步回调带来的各种问题。
构造函数
Future(FutureOr<T> computation())
computation 的返回值可以是普通值或者是Future对象
例如返回一个数值
void main() { Future<int> num=Future((){ print('async'); return 123; }); }
返回一个Future
Future<Future> futureDemo=Future((){ print('future async'); return num; });
需要注意的是,computation函数体中的代码是被异步执行的,这与Promise构造函数的回调执行时机是不一样的,如需要被同步执行,则使用如下这个命名构造函数:
Future.sync(FutureOr<T> computation())
Future<int> future = Future.sync((){ print('sync call'); return 123; });
示例:
void main() { print("start"); Future<String> num=Future((){ return "第一个Future"; }); num.then((val)=>print(val)); Future.sync(()=>print("同步执行Futuer")); Future.delayed(Duration(seconds: 1), () { print("延迟执行Futuer"); }); print("end"); }
打印顺序
Future 的常用函数
Future.then() 任务执行完成会进入这里,能够获得返回的执行结果。
Future.catchError() 有任务执行失败,可以在这里捕获异常。
Future.whenComplete() 当任务停止时,最后会执行这里。
Future.wait() 可以等待多个异步任务执行完成后,再调用 then()。只要有一个执行失败,就会进入 catchError()。
Future.delayed() 延迟执行一个延时任务。
Future.sync同步执行
Future.microtask 创建一个在微任务队列里运行的Future:
Future.wait([ // 2秒后返回结果 Future.delayed(new Duration(seconds: 2), () { return "hello"; }), // 4秒后返回结果 Future.delayed(new Duration(seconds: 4), () { return " world"; }) ]).then((results) { //执行成功会走到这里 print(results[0]+results[1]); }).catchError((e){ //执行失败会走到这里 print(e); }).whenComplete((){ //无论成功或失败都会走到这里 print("我都会执行"); });
Future.then()
Future<String> num=Future((){ return "第一个Future"; }); num.then((val)=>print(val));
Future.microtask ()
Future.microtask(() => print("在Microtask queue里运行的Future"));
Future.catchError()
Future(()=> throw 'we have a problem') .then((_)=> print('callback1')) .then((_)=> print('callback2')) .catchError((error)=>print('$error'))//这里会执行 .whenComplete(()=> print('whenComplete'));//这里也会执行
以上就是对Future的一些主要用法的介绍。Future背后的实现机制还是有一些复杂的。这里先列几个来自Dart官网的关于Future的烧脑说明。大家先感受一下:
你通过then串起来的那些回调函数在Future完成的时候会被立即执 行,也就是说它们是同步执行,而不是被调度异步执行。
如果Future在调用then串起回调函数之前已经完成,
那么这些回调函数会被调度到微任务队列异步执行。通过Future()和Future.delayed()实例化的Future不会同步执行,它们会被调度到事件队列异步执行。
通过Future.value()实例化的Future会被调度到微任务队列异步完成,类似于第2条。
通过Future.sync()实例化的Future会同步执行其入参函数,然后(除非这个入参函数返回一个Future)调度到微任务队列来完成自己,类似于第2条。
发表评论
侧栏公告
寄语
譬如朝露博客是一个分享前端知识的网站,联系方式11523518。
热评文章
标签列表
热门文章
友情链接