- 當(dāng)你想執(zhí)行一個(gè)異步函數(shù),并想讓他返回結(jié)果的時(shí)候文留,你會(huì)用到
Future<類型> 函數(shù)名() { /// 代碼塊}
,但是你如果不想讓他立刻返回,而是等你的命令再返回應(yīng)該怎么辦问麸?
- 這時(shí)候就可以用到Completer。場景是這樣的,我通過Modbus協(xié)議,執(zhí)行一個(gè)異步函數(shù),發(fā)送一段指令钞翔,代碼是這樣的
Uint8List data = Uint8List(2);
ByteData.view(data.buffer)..setUint8(0, 3);
var data = await sendData(data);
Future<Uint8List> sendData(Uint8List data)
{
_connector.write(function, data);
}
這時(shí)候指令通過_connector.write(data);
方法已經(jīng)發(fā)過去了严卖,但是
Future<Uint8List> sendData(Uint8List data)
這個(gè)方法還沒有返回值,而且我這里也不知道要返回什么布轿,我是否可以先把這個(gè)異步方法掛著哮笆,先返回一個(gè)future,但是這個(gè)future 是沒有完成的来颤,等到Modbus 協(xié)議的服務(wù)端給我返回消息時(shí),我再讓他完成稠肘。
- 這時(shí)候定義一個(gè)Completer福铅,返回他的future
Completer _completer;
Future<Uint8List> sendData(Uint8List data)
{
_completer = Completer<Uint8List>();
_connector.write(function, data);
return _completer.future;
}
這里就算返回了 _completer.future;
前面的var data = await sendData(data);
也不會(huì)執(zhí)行完,而是在這里掛著,什么時(shí)候異步執(zhí)行完了,這句才會(huì)執(zhí)行完畢项阴。
- 剩下的就簡單了,等監(jiān)聽到服務(wù)端的返回的消息時(shí)滑黔,把消息處理處理,然后執(zhí)行
/// responseData 是經(jīng)過處理的服務(wù)端返回的消息,也就是你想到的數(shù)據(jù)
_completer.complete(responseData);
這句代碼執(zhí)行后,Future<Uint8List> sendData(Uint8List data)
這個(gè)異步函數(shù)才算執(zhí)行完成环揽,相應(yīng)的var data = await sendData(data);
里的data 才會(huì)獲取數(shù)據(jù)略荡。