dart-异步
转载于https://www.jianshu.com/p/a4affde4c8ca
当Event Looper正在处理Microtask Queue中的Event时候,Event Queue中的Event就停止了处理了,此时App不能绘制任何图形,不能处理任何鼠标点击,不能处理文件IO等等
Event-Looper挑选Task的执行顺序为:
- 优先全部执行完Microtask Queue中的Event
- 直到Microtask Queue为空时,才会执行Event Queue中的Event
例子:
void main(){ new Future(() => futureTask) // 异步任务的函数 .then((m) => "futueTask execute result:$m") // 任务执行完后的子任务 .then((m) => m.length) // 其中m为上个任务执行完后的返回的结果 .then((m) => printLength(m)) .whenComplete(() => whenTaskCompelete); // 当所有任务完成后的回调函数 } int futureTask() { return 21; } void printLength(int length) { print("Text Length:$length"); } void whenTaskCompelete() { print("Task Complete"); }
future一般情况声明格式:future(function)
其中参数function为要求future执行的函数
future构造函数的返回值类型也是future类型的
future.then(x)是注册了一个回调函数x,当前面的future对象计算完成的时候就会调用该回调函数x,并且调用函数x的参数就是前面future参数function的返回值(注意是function的返回值,不是future的返回值) 写全一点:future(function=>T).then( x(T) ),这样可以很清楚的看出调用的关系链。
观察上面的代码:
new Future(() => futureTask) // 异步任务的函数 .then((m) => "futueTask execute result:$m") // 任务执行完后的子任务 .then((m) => m.length) // 其中m为上个任务执行完后的返回的结果 .then((m) => printLength(m)) .whenComplete(() => whenTaskCompelete); // 当所有任务完成后的回调函数 }
future里的function返回21,是一个int
第一个then的参数m就是前面返回的21
第二个then的参数m是第一个then返回的字符串"futueTask execute result:$m"
第三个then的参数m是第二个then返回的m.length,所以才能printLength(m)
whenComplete是所有任务完成后的回调函数
进击的小🐴农