天天看点

Dart语言学习日记(九)异步

Dart语言面向对象程序设计

  • 异步
    • Future
      • 1.异步读文件
      • 2.同步读文件
    • async和await
    • Stream

异步

Future

Future表示在将来某时获取一个值的方式,当一个返回Future方法被调用时,该方法会把要执行的某事件放入队列,并返回一个未完成的Future对象,在该事件执行完毕后,Future对象的状态会自动变成已经完成,此时可以通过then链式调用或async和await获取该事件的返回值,并对返回值进行相应处理。

例:定义1个从指定文件异步读出文件内容的方法,并将文件内容输出。

1.异步读文件

Dart语言中通过File对象的readAsSting()方法异步读取文件,该方法返回的一个Future<String>对象,Future有一个then方法,该方法如下:

Future<R> then<R>(
	FutureOr<R> onValue(
		T value
	),{
	Function onError
}); 
           

2.同步读文件

Dart语言中同样也提供了同步读文件机制,即调用File类的同步读文件方法readAsStringSync()读文件时,需要等文件读完后才能执行后面的功能模块。

例:定义1个从指定文件同步读出文件内容的方法,并将文件内容输出。

(1)定义readFileSync()方法

String readFileSync(String filePath){
	File file = File(filePath);
	return file.readAsStringSync();
}
           

(2)定义main()方法

void main(){
	print('start');
	String info = readFileSync("temp/info.txt");
	print(info);			//输出读出的文件内容
	print('end');
}
           

async和await

Dart语言中提供了async和await机制,让异步任务的执行看起来和同步代码的执行顺序一致。

async用来表示定义的方法是异步执行的,该方法会返回一个Future对象;await后面也是一个Future对象,表示该异步任务完成,只有异步任务执行完成后才会继续执行后面的任务代码。

async的作用就是标记一个方法是异步方法;await的作用是等待异步任务的结果。

例:用async和await机制实现异步读文件,并产生如前例所示输出效果:

void mian() async {
	print('start');
	String info = await reaFile("temp/info.txt");
	print(info);
	print('end');
}
           

使用async和await实现代码异步执行机制包含以下四个要点:

(1)await只能在标记了async的异步方法中使用,否则报错;

(2)当使用async作为方法名后缀声明时,说明这个方法的返回值是一个Future类型;

(3)当执行到该方法中用await标注的代码时,会暂停该方法其他部分的代码执行;

(4)当await标注的代码引用的Future类型返回值执行完成,await标注的代码后的下一行代码会立即执行。

Stream

Stream和Future是Dart语言实现异步处理机制的核心API,用Future实现异步处理时,所有异步操作的返回值都是有Future表示,但是Future只能表示一次异步获得的数据,而Stream实现异步事件流的处理,它表示多次异步获得的数据。

采用Stream方式读文件内容时,一般情况下每次可以读取一部分数据,并进行相应的处理。

例:定义1个用Stream方式从指定文件读出文件内容的方法,并将文件内容输出。

openRead()方法返回一个Sream<List<int>>类型的数据,也就是一个存放了int类型数组的数据流。在获得一个Stream实例对象后,就是通过listen()方法订阅Stream上发出的数据(即事件),有事件发出时就会通知订阅者进行相应的事件处理。listen()方法如下:

StreamSubscription<T> listen(
	void onData(T event),
	{
		Function onError,
		void onDone(),
		bool cancelOnError}
);