如果其中任何一个 return 成功,如何立即 return 停止同时执行异步函数?

How to immediately return from simultaneous execution of async functions if any of them returns with success?

我正在努力改进 internet_connection_checker。该代码“ping”给定主机的列表以确定设备是否真正具有互联网连接。当前的逻辑已得到充分增强,可以同时执行 ping,但它仍会等待所有 ping 完成。不幸的是,如果任何主机的响应速度很慢(虽然设备有连接,只是远程主机有一些不满),那么整个结果可能需要 10 秒的超时才能完成,尽管包中可能已经有成功的结果。我正在努力弄清楚如何实现这一目标。

  Future<bool> get hasConnection async {
    final Completer<bool> result = Completer<bool>();
    int length = addresses.length;

    for (AddressCheckOptions addressOptions in addresses) {
      await isHostReachable(addressOptions).then(
        (AddressCheckResult request) {
          length -= 1;
          if (!result.isCompleted) {
            if (request.isSuccess) {
              result.complete(true);
            } else if (length == 0) {
              result.complete(false);
            }
          }
        },
      );
    }

    return result.future;
  }

尝试以下操作。我们不想在这里使用 await(我已经从方法中删除了 async,因为它现在没用了)因为我们希望循环进行所有 isHostReachable 的调用而不等待任何其他的:

  Future<bool> get hasConnection {
    final Completer<bool> result = Completer<bool>();
    int length = addresses.length;

    for (AddressCheckOptions addressOptions in addresses) {
      isHostReachable(addressOptions).then(
        (AddressCheckResult request) {
          length -= 1;
          if (!result.isCompleted) {
            if (request.isSuccess) {
              result.complete(true);
            } else if (length == 0) {
              result.complete(false);
            }
          }
        },
      );
    }

    return result.future;
  }

相反,我们让 .then() 处理在您获得结果并完成完成时应该发生的事情。