Dart 套接字监听不会等到完成
Dart socket listen doesn't wait until done
我想在函数中执行这些操作:
1-连接插座
2-发送查询
3- 收听数据
4- return 数据
但是当我尝试套接字时。 listen 函数不会等待,即使我在上面放了 await 。它说这不是未来,它是一个 Stream 对象,但我对 Streams 一无所知,所以我被困在这里。我怎么能按照我说的去做?
static sendQuery({required String query,args, dimension}) async {
if(args != null)
args.forEach((element) => query = query.replaceFirst("?", element));
String ip = shared.getData("remote_ip");
int port = shared.getData("remote_port");
String data = "";
await Socket.connect(ip, port,timeout: Duration(seconds: 5)).then((soket) {
soket.write(query);
soket.listen((Uint8List buffer) async {
String _buffer = String.fromCharCodes(buffer);
data += _buffer;
},
onDone: () {});
});
print("Data has returned. Length of data: ${data.length}");
return data;}
您正在 await
调用 Socket.listen
, but that returns a StreamSubscripton
的结果,而不是 Future
,并且您只能在 Future
上使用 await
s.
但是,您可以使用 StreamSubscription.asFuture
创建一个 Future
,它将在 Stream
正常完成或出现错误时完成。
此外,同时使用 .then()
和 await
是不一致的。选一个;使用 await
通常更直接:
var socket = await Socket.connect(ip, port, timeout: Duration(seconds: 5));
soket.write(query);
var subscription = soket.listen((Uint8List buffer) async {
String _buffer = String.fromCharCodes(buffer);
data += _buffer;
});
await subscription.asFuture<void>();
我想在函数中执行这些操作:
1-连接插座
2-发送查询
3- 收听数据
4- return 数据
但是当我尝试套接字时。 listen 函数不会等待,即使我在上面放了 await 。它说这不是未来,它是一个 Stream 对象,但我对 Streams 一无所知,所以我被困在这里。我怎么能按照我说的去做?
static sendQuery({required String query,args, dimension}) async {
if(args != null)
args.forEach((element) => query = query.replaceFirst("?", element));
String ip = shared.getData("remote_ip");
int port = shared.getData("remote_port");
String data = "";
await Socket.connect(ip, port,timeout: Duration(seconds: 5)).then((soket) {
soket.write(query);
soket.listen((Uint8List buffer) async {
String _buffer = String.fromCharCodes(buffer);
data += _buffer;
},
onDone: () {});
});
print("Data has returned. Length of data: ${data.length}");
return data;}
您正在 await
调用 Socket.listen
, but that returns a StreamSubscripton
的结果,而不是 Future
,并且您只能在 Future
上使用 await
s.
但是,您可以使用 StreamSubscription.asFuture
创建一个 Future
,它将在 Stream
正常完成或出现错误时完成。
此外,同时使用 .then()
和 await
是不一致的。选一个;使用 await
通常更直接:
var socket = await Socket.connect(ip, port, timeout: Duration(seconds: 5));
soket.write(query);
var subscription = soket.listen((Uint8List buffer) async {
String _buffer = String.fromCharCodes(buffer);
data += _buffer;
});
await subscription.asFuture<void>();