【问题标题】:Executing multiple async functions not in parallel Dart/Flutter不并行执行多个异步函数 Dart/Flutter
【发布时间】:2020-11-14 15:40:45
【问题描述】:

我有一个使用 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);

在这种情况下,command2 可以在命令 1 之前返回结果。有没有办法一个接一个地执行多个“等待”方法,但只有在我确保之前的执行收到响应之后?

【问题讨论】:

  • 显示写方法代码
  • 你可以做类似btwrite.write(command1).then(btwrite.write(command2).then(...));
  • @jitsm555 github.com/pauldemarco/flutter_blue,特别是这个github.com/pauldemarco/flutter_blue/blob/master/lib/src/…,第107行。这是一个插件,不是我写的。
  • @dev-aentgs 使用.then() 无济于事。 await.then() 的语法糖,并且已经序列化了对 btwrite.write() 的调用。这里的问题是 OP 需要等待每个 response.
  • @jamesdlin 完全正确,问题是响应不是来自该等待函数,而是来自另一个侦听器。

标签: flutter dart async-await bluetooth-lowenergy bluetooth-gatt


【解决方案1】:

您提供的代码已经序列化了对btwrite.write() 的调用。但是,btwrite.write(command2) 只等待command1写入,而不等待相应的响应

我不熟悉这个插件,也不精通 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);

【讨论】:

  • 我想这就是我要找的,我现在就试试
  • 还是有问题,不仅没有响应,甚至连“响应”都没有打印出来
  • 这有帮助,我必须在结束“写”未来之前添加对“响应”命令的跟踪
【解决方案2】:

考虑到我们添加一个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;
  }
}

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

【讨论】:

    猜你喜欢
    • 2021-12-07
    • 2021-08-17
    • 2018-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-17
    相关资源
    最近更新 更多