如果其中任何一个 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()
处理在您获得结果并完成完成时应该发生的事情。
我正在努力改进 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()
处理在您获得结果并完成完成时应该发生的事情。