1、什么是Future?

Dart是一门单线程编程语言。如果任何代码阻塞线程执行都会导致程序卡死。异步编程防止出现阻塞操作。Dart使用Future对象表示异步操作。Future表示在将来某时获取一个值的方式。为了获得Future的值,可以使用async和await。

简单来说,Future就是一个Future<T>对象,当执行return await...的时候,实际上返回的是一个延迟计算的Future对象,

备注:这个Future对象是Dart内置的,有自己的队列策略,它将要操作的事件放入EventQueue中,在队列中的事件按照先进先出的原则去逐一处理事件,当事件处理完成后,将结果返回给Future对象。

2、如何获取Future对象?

为了获得Future的值,可以使用async和await。

async:标记某个方法为异步方法(耗时方法),在声明方法的时候使用。
await:等待某个异步方法执行完毕,是“等待”之意,所以要在调用耗时方法的时候使用。

首先看一个例子:

getData() async{
   return await http.get(Uri.encodeFull(url), headers: {"Accept": "application/json"});
}
//然后调用函数来获取结果
String data = getData();

这段代码在运行的时候会报错。因为data是String类型,而函数getData()是一个异步操作函数,其返回值是一个await延迟执行的结果。在Dart中,有await标记的运算,结果都是一个Future对象,Future不是String类型,所以就报错了。

如何获取异步函数的结果呢?Dart规定有async标记的函数,只能由await来调用,那么我们可以在函数前加一个await关键字:

String data = await getData();

但是,上面代码又违背了await必须要在async标记的函数中使用,所以赋值代码可以改成:

String data;
setData() async {
  data = await getData();    //getData()延迟执行后赋值给data
}

3、async和await使用总结

async和await的使用其实就只有两点:

第一点:await关键字必须在async函数内部使用

第二点:调用async函数必须使用await关键字

标签: none

添加新评论