不并行执行多个异步函数 Dart/Flutter
Executing multiple async functions not in parallel Dart/Flutter
我有一个使用 BLE 通过蓝牙与设备通信的应用程序。它使用关贸总协定。简单来说,我向地址 1 发送命令,在地址 2 上收到响应。这与问题无关,但它有助于解释为什么“异步”函数无法以简单的方式检索响应。所以要向 BLE 设备发送命令,我会执行如下操作:
await btwrite.write(command);
.write 方法是一个“Future<Null>
”
现在的问题是我必须发送多个命令,每个命令都依赖于前一个命令。例如,这是流程:
Command 1 -> Response 1 -> Command 2 -> Response 2
我必须等待响应才能发送下一个命令。我只能使用异步函数发送,所以我必须像这样调用多个等待:
btread.value.listen((v) {
print('Response:' + v.toString());
});
await btwrite.write(command1);
await btwrite.write(command2);
在这种情况下,命令 2 可以在命令 1 之前 return 结果。有没有办法一个接一个地执行多个“等待”方法,但只有在我确保之前的执行收到响应之后?
您提供的代码已经序列化了对 btwrite.write()
的调用。但是,btwrite.write(command2)
只等待 write for command1
,而不等待相应的 response.
我不熟悉这个插件,也不精通 Dart 流,但是你可以创建一个辅助函数来执行写入并从响应流中获取 Future
,这就是您实际上想等待,例如:
Future<void> write(List<int> command) async {
// You'll probably want to use `collectBytes` from `package:async` instead.
Future<List<int>> response = btread.value.first;
await btwrite.write(command);
var v = await response;
print('Response:' + v.toString());
}
...
await write(command1);
await write(command2);
考虑我们添加一个 btResponse
变量来跟踪下面 Listener
中收到的响应
String btResponse;
btread.value.listen((v) {
print('Response:' + v.toString());
btResponse = v.toString();
});
我们可以这样做:
await btwrite.write(command1);
while (true) {
if(btResponse!=null){
btResponse = null;
await btwrite.write(command2);
break;
}
}
这是一个粗略的建议,不确定是否有帮助。
我有一个使用 BLE 通过蓝牙与设备通信的应用程序。它使用关贸总协定。简单来说,我向地址 1 发送命令,在地址 2 上收到响应。这与问题无关,但它有助于解释为什么“异步”函数无法以简单的方式检索响应。所以要向 BLE 设备发送命令,我会执行如下操作:
await btwrite.write(command);
.write 方法是一个“Future<Null>
”
现在的问题是我必须发送多个命令,每个命令都依赖于前一个命令。例如,这是流程:
Command 1 -> Response 1 -> Command 2 -> Response 2
我必须等待响应才能发送下一个命令。我只能使用异步函数发送,所以我必须像这样调用多个等待:
btread.value.listen((v) {
print('Response:' + v.toString());
});
await btwrite.write(command1);
await btwrite.write(command2);
在这种情况下,命令 2 可以在命令 1 之前 return 结果。有没有办法一个接一个地执行多个“等待”方法,但只有在我确保之前的执行收到响应之后?
您提供的代码已经序列化了对 btwrite.write()
的调用。但是,btwrite.write(command2)
只等待 write for command1
,而不等待相应的 response.
我不熟悉这个插件,也不精通 Dart 流,但是你可以创建一个辅助函数来执行写入并从响应流中获取 Future
,这就是您实际上想等待,例如:
Future<void> write(List<int> command) async {
// You'll probably want to use `collectBytes` from `package:async` instead.
Future<List<int>> response = btread.value.first;
await btwrite.write(command);
var v = await response;
print('Response:' + v.toString());
}
...
await write(command1);
await write(command2);
考虑我们添加一个 btResponse
变量来跟踪下面 Listener
String btResponse;
btread.value.listen((v) {
print('Response:' + v.toString());
btResponse = v.toString();
});
我们可以这样做:
await btwrite.write(command1);
while (true) {
if(btResponse!=null){
btResponse = null;
await btwrite.write(command2);
break;
}
}
这是一个粗略的建议,不确定是否有帮助。