Прежде всего, вы не знаете точно, что весь ответ на вашу отправку поступает в один пакет, поэтому у вас может не быть всего ответа. Предположим, что вы это сделаете (иначе вам нужно будет сделать больше обработки в dataHandler
, чтобы собрать ответ до его доставки).
Канонический способ разрешить обратный вызов, когда что-то произошло в будущее, должно вернуть Future
. Вам также понадобится способ завершить это будущее, поэтому вы создадите Completer
и сохраните его, пока он вам не понадобится. Поскольку вы, вероятно, можете делать больше сообщений, вам нужно помнить более одного дополнения. Итак, в целом, я бы написал это как:
Queue<Completer<String>> _queue = Queue();
Future<String> send(String cmd){
socket.writeln(cmd);
var completer = new Completer<String>();
_queue.add(completer);
return completer.future;
}
void _dataHandler(data){
var reply = new String.fromCharCodes(data).trim();
// Add some sanity checking here. Make sure you have the entire response before
// executing the code below.
_queue.removeFirst().complete(reply);
}
(я сделал _dataHandler
приватным, потому что вы, вероятно, не хотите, чтобы пользователь, вызывающий send
, мог позвонить dataHandler
). [/ д2]