onRecvValue<T> method

SelectBuilder<R> onRecvValue<T>(
  1. Receiver<T> rx,
  2. FutureOr<R> body(
    1. T
    ), {
  3. Object? tag,
  4. FutureOr<R> onError(
    1. RecvError e
    )?,
  5. FutureOr<R> onDisconnected()?,
  6. bool if_()?,
})

Race a channel receiver - only handle successful messages.

Waits for successful values from the channel, ignoring errors. Use when you only care about valid data and want other branches to handle error conditions.

Example:

await XSelect.run<String>((s) => s
  ..onRecvValue(userInputs, (input) => 'User: $input')
  ..onRecvValue(apiResponses, (response) => 'API: $response')
  ..onRecvError(errorChannel, (error) => 'Error: $error')
  ..onTimeout(Duration(seconds: 10), () => 'No activity')
);

See also:

Implementation

SelectBuilder<R> onRecvValue<T>(Receiver<T> rx, FutureOr<R> Function(T) body,
    {Object? tag,
    FutureOr<R> Function(RecvError e)? onError,
    FutureOr<R> Function()? onDisconnected,
    bool Function()? if_}) {
  return onRecv<T>(rx, (result) {
    if (result.hasValue) {
      return body(result.value);
    }
    if (result.isDisconnected && onDisconnected != null) {
      return onDisconnected();
    }
    if (result.hasError && onError != null) {
      return onError(result.error);
    }
    return Future<R>.error(StateError('Unexpected RecvResult: $result'));
  }, tag: tag, if_: if_ ?? () => !rx.isDisconnected);
}