Dart 關(guān)于Completer

  • 當你想執(zhí)行一個異步函數(shù),并想讓他返回結(jié)果的時候,你會用到
    Future<類型> 函數(shù)名() { /// 代碼塊},但是你如果不想讓他立刻返回,而是等你的命令再返回應該怎么辦?
  1. 這時候就可以用到Completer。場景是這樣的,我通過Modbus協(xié)議,執(zhí)行一個異步函數(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);
}

這時候指令通過_connector.write(data);方法已經(jīng)發(fā)過去了,但是
Future<Uint8List> sendData(Uint8List data) 這個方法還沒有返回值,而且我這里也不知道要返回什么,我是否可以先把這個異步方法掛著,先返回一個future,但是這個future 是沒有完成的,等到Modbus 協(xié)議的服務端給我返回消息時,我再讓他完成。

  1. 這時候定義一個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);也不會執(zhí)行完,而是在這里掛著,什么時候異步執(zhí)行完了,這句才會執(zhí)行完畢。

  1. 剩下的就簡單了,等監(jiān)聽到服務端的返回的消息時,把消息處理處理,然后執(zhí)行
  /// responseData 是經(jīng)過處理的服務端返回的消息,也就是你想到的數(shù)據(jù)
  _completer.complete(responseData);

這句代碼執(zhí)行后,Future<Uint8List> sendData(Uint8List data) 這個異步函數(shù)才算執(zhí)行完成,相應的var data = await sendData(data);里的data 才會獲取數(shù)據(jù)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容