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是所有任务完成后的回调函数

 

posted @ 2020-07-26 21:46  NeoZy  阅读(148)  评论(0编辑  收藏  举报