Flutter-异步编程

205 阅读2分钟

Future

Future表示一个异步操作的最终完成及其结果的表示。简单来说Future就是用来处理异步操作的,异步处理成功了就执行成功的操作,异步处理失败了就捕获错误或者停止后续操作。

一个Future只会对应一个结果,要么成功,要么失败;需要注意的是,Future的所有API的返回值仍然是一个Future对象

void getData(){

  print('开始');
  Future((){
    print('耗时操作开始');

    sleep(Duration(seconds: 3));

    print('耗时操作结束');
  });

  print('结束');
}

打印结果为:
flutter: 开始
flutter: 结束
flutter: 耗时操作开始
flutter: 耗时操作结束

await/async

  • async用来表示函数是异步的,定义的函数会返回一个Future对象,可以使用then方法添加回调函数;

  • await后面是一个Future,表示等待该异步任务完成,异步完成后才会继续往下执行;await必须出现在async函数内部;

我们来看一段代码:

void getData() async {

  print('开始');
  await Future((){
    print('耗时操作开始');

    sleep(Duration(seconds: 3));

    print('耗时操作结束');
  });
  print('结束');
}

打印结果为:
flutter: 开始
flutter: 耗时操作开始
flutter: 耗时操作结束
flutter: 结束

then

可以看到下方代码,因为Future是异步操作,方法执行了开始、结束后开始执行Future内部代码,当Future内部代码执行完毕后才开始执行then函数。

void getData()  {

  print('开始');
   Future((){
    print('耗时操作开始');

    sleep(Duration(seconds: 3));

    print('耗时操作结束');
    return 'success';
  })
  .then((value){
    print('then函数调用 value = $value');
  });

  print('结束');

}
打印结果为:
flutter: 开始
flutter: 结束
flutter: 耗时操作开始
flutter: 耗时操作结束
flutter: then函数调用 value = success

但是如果我们加上async/await呢 可以看到先执行开始,然后需要等待Future执行完后才能执行结束,Future内就按照顺序执行了

void getData() async {

  print('开始');
  await Future((){
    print('耗时操作开始');

    sleep(Duration(seconds: 3));

    print('耗时操作结束');
    return 'success';
  })
  .then((value){
    print('then函数调用 value = $value');
  });

  print('结束');
}

打印结果为:
flutter: 开始
flutter: 耗时操作开始
flutter: 耗时操作结束
flutter: then函数调用 value = success
flutter: 结束

catchError/onError

如果catchError在then方法前面,即使在catchError中捕获了异常,那么then方法依然会执行

catchError是在整个Future的链式调用过程中捕获异常,而onError只在当前then中处理,我们在一个链式调用的过程中可能存在多个then

可以看到,使用then中的onError方法捕获错误之后,catchError将不会调用

void getData() {

  print('开始');
    Future((){
    print('耗时操作开始');

    // sleep(Duration(seconds: 3));

    print('耗时操作结束');
    throw Exception('我发生了崩溃');
    return 'success';
  })
  .then((value){
    print('then函数调用 value = $value');
  })
  .catchError((e){
    print('catchError捕获的异常为;${e.toString()}');
  })
  .whenComplete((){
    print('全部执行完毕');
  });

  print('结束');

}

打印结果为:
flutter: 开始
flutter: 结束
flutter: 耗时操作开始
flutter: 耗时操作结束
flutter: catchError捕获的异常为;Exception: 我发生了崩溃
flutter: 全部执行完毕

whenComplete

我们的异步任务无论成功与失败,都需要去做一些其他事情的时候,就可以使用whenComplete