singleResultFuture<R> function
Creates a Future, and a SendPort that can be used to complete that future.
Calls action
with the response SendPort
, then waits for someone
to send a future result on that port using sendFutureResult.
The returned Future
is completed with the future result sent on the port.
If action
throws, which it shouldn't,
the returned future is completed with that error,
unless someone manages to send a message on the port before action
throws.
If timeout
is supplied, it is used as a limit on how
long it can take before the message is received. If a
message isn't received in time, the onTimeout
is called,
and the future is completed with the result of that call
instead.
If onTimeout
is omitted, it defaults to throwing
a TimeoutException.
Implementation
Future<R> singleResultFuture<R>(void Function(SendPort responsePort) action,
{Duration? timeout, FutureOr<R> Function()? onTimeout}) {
var completer = Completer<R>.sync();
var port = singleCompletePort<R, List<Object?>>(completer,
callback: receiveFutureResult, timeout: timeout, onTimeout: onTimeout);
try {
action(port);
} catch (e, s) {
// This should not happen.
sendFutureResult(Future.error(e, s), port);
}
return completer.future;
}