不并行执行多个异步函数 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;
  }
}

这是一个粗略的建议,不确定是否有帮助。