Flutter笔记之异步处理

415 阅读2分钟

await 和async

flutter中,只有一个线程,所有任务放在eventqueue中分别执行。另外还有一个microeventqueue, 在每个event执行前先完成这个队列中的任务。await表达式会阻塞代码运行,直到返回结果。 使用await标注的函数必须使用async标注异步函数,异步函数实际返回Future<>。例子:

//同步函数:
String lookUpVersion() => ‘1.0.0’;
//异步函数:
Future<String> lookUpVersion() async => ‘1.0.0';

Future:

future是async函数返回的对象,或者说async函数会直接返回一个future对象,而函数里面执行的内容,会在future里面单独异步执行,对比java中的异步回调函数,直接执行返回的值还没有产生,在值产生以后,调用callback把result返回给外部。对应future就是 future.then()函数。

Future.then():

future中执行完成的任务后会调用then()。例如:HttpRequest.getString()会返回一个future对象,因为需要等待一段时间,所以当future执行完成以后并保证字符串有效后可以调用then来执行像要执行的代码。例子:

    HttpRequest.getString(url).then((String result) {
  		print(result);
	}).cactheErroe((e){
	//////		
	});

then() 方法中传入的方法参数,该方法的入参就是Future<String>中的范型,既async函数原本返回的值;then().cacheError(); 是try-cache的异步版本,可以在then中捕获异常。

(cacheError确保在then以后调用,不然只能捕获future中产生的异常)

Future链式异步调用:

有意思的是,then方法返回的也是一个future对象,返回的方式与future一样,如果then注册的方法返回一个future,则返回一个等价的future,如果有其他返回类型,则返回future<dynamic>。例子:

    Future result = costlyQuery(url);
    result
    	.then((value) => expensiveWork(value))
    	.then((_) => lengthyComputation())
    	.then((_) => print('Done!'))
    	.catchError((exception) {
  	/* Handle exception... */
	});

这样就实现了链式异步调用,有点像rxjava。上面代码使用await实现方式:

	try {
	  final value = await costlyQuery(url);
 	 await expensiveWork(value);
	  await lengthyComputation();
	  print('Done!');
	} catch (e) {
	  /* Handle exception... */
	}

Future多个异步调用:

Future.await([
//////////,
//////////,
]).then();

会直接同时执行await中的每个async函数,全部执行完再执行then。