如何使用 Dart socket onError 作为内联函数?

How to use Dart socket onError as inline function?

我有一个可以获取很长数据的 dart 套接字。幸运的是,第三方在数据末尾添加了'\r\n',所以当我发现最后一个数据有'\r\n'时我可以关闭。

几周后,由于服务器问题,我试图获取长数据。在我习惯于无休止地等待服务器关闭连接之前(有时需要 10 到 12 分钟)

现在似乎一切正常,但出现了一个小问题。我曾经使用 void 函数获取 onError 和 onDone。但是我正在使用 aqueduct,所以我需要 return 从服务器收到响应后的长数据。

在我下面的完整代码中,它一直在打印 "Server_Error"。如果我在下面发表评论,数据似乎一切正常。但我的问题是我还需要 return 错误数据。

onError: () {
      print("Server_Error");
      },
        onDone: () {
      _socket.destroy();
      },
        cancelOnError: true);

如果我在上面的部分发表评论,我可以打印长数据。 我的问题是,根据我的场景如何使用 Dart 套接字 onError 作为内联函数?

import 'dart:io';
import 'dart:convert';
import 'dart:typed_data';

Socket _socket;
String _reply;
String _testValue = "";

main() async {
  String _queryA = “QueryLongData”;

  await Socket.connect("192.168.22.120”, 3000).then((Socket sock) {
    _socket = sock;
    _socket.write('$_queryA\r\n');
    _socket.listen((data) {
      final List<int> byteArray = data;
      _reply = String.fromCharCodes(byteArray);

      int dataLen = _reply.length;
      int carriageReturnPosition = dataLen - 2;
      int newLinePosition = dataLen - 1;

      _testValue = _testValue + _reply;

      if (_reply.substring(carriageReturnPosition, newLinePosition) == '\r' &&
          _reply.substring(newLinePosition, dataLen) == '\n') {
        _socket.close();
        print("Data: $_testValue"); // means return data

      }
    }, onError: () {
      print("Server_Error");
      },
        onDone: () {
      _socket.destroy();
      },
        cancelOnError: true);
  }).catchError((e) {
    print("Server_Error");
  });

  if(_socket.done == true) {
    print("Exiting...");
    exit(0);
  }
}
<!-- language: dart -->  
String _queryA = "QueryLongData";  
Socket.connect("192.168.22.120", 3000).then((Socket sock) {  
    _socket = sock;  
    _socket.write("$_queryA\r\n");  
    _socket.listen((data) {  
        final List<int> byteArray = data;  
        _reply = String.fromCharCodes(byteArray);  

        int dataLen = _reply.length;  
        int carriageReturnPosition = dataLen - 2;  
        int newLinePosition = dataLen - 1;  
        _testValue = _testValue + _reply;  

        if (_reply.substring(carriageReturnPosition, newLinePosition) == "\r" &&
            _reply.substring(newLinePosition, dataLen) == "\n") {  
            _socket.close();  
            print("Data: $_testValue"); // means return data  
        }  
    }, onError: () => print("Server_Error"),  
    onDone: () => _socket.destroy(),  
    cancelOnError: true);  
}).catchError((e) => print("Server_Error"));  

if( ( await _socket.done enter code here) == true) {  
    print("Exiting...");  
    exit(0);  
}