使用场景举例:
客户端给服务端发送数据:
var data = await sendData(data);
Future<Uint8List> sendData(Uint8List data)
{
_connector.write(function, data);
}
_connector.write(function, data);
方法已经将数据将发出去了,但是Future<Uint8List> sendData(Uint8List data)
这个方法还没有返回值,因为服务端还没有返回数据。我们可以先把这个异步方法挂着,先返回一个future,但是这个 future 是没有完成的,等到服务端返回数据时,再让他完成。这时候可以定义一个Completer,返回他的future:
var data = await sendData(data);
Completer _completer;
Future<Uint8List> sendData(Uint8List data)
{
_completer = Completer<Uint8List>();
_connector.write(function, data);
return _completer.future;
}
注意,这里就算返回了 _completer.future;
,前面的var data = await sendData(data);
也不会继续执行,而是一直阻塞着,什么时候异步执行完了,var data = await sendData(data);
这句才会执行完毕。
当监听到服务端的返回的消息时,将消息进行处理,然后执行:
// responseData 是经过处理的服务端返回的消息,也就是客户端希望获取的数据
_completer.complete(responseData);
这句代码执行后,Future<Uint8List> sendData(Uint8List data)
这个异步函数才算执行完成,相应的 var data = await sendData(data);
里的 var data
才会获取到数据。
参考:
Dart 关于Completer