emitAndWaitSideEffect<V> method
Emits a JEffect and waits for its completion or timeout. Missing listeners and disposal fail with StateError. This does not cancel UI handlers or external operations that have already started.
Implementation
Future<V> emitAndWaitSideEffect<V>(
JEffect<V> effect, {
Duration? timeout,
}) async {
// An explicitly awaited fire-and-forget effect also needs a listener.
if (mounted &&
_effectBufferSize == 0 &&
!_sideEffectController.hasListener) {
_failEffect(effect, _missingListenerError(effect));
return effect.result;
}
// Emit the effect
emitSideEffect(effect);
if (effect is JFireAndForgetEffect) _trackEffect(effect);
// Apply timeout if configured
final appliedTimeout = timeout ?? JEffectsConfig().defaultTimeout;
// If no timeout is set, return the effect's result immediately
if (appliedTimeout == null) return effect.result;
// Apply timeout logic
return effect.result.timeout(
appliedTimeout,
onTimeout: () {
final error = TimeoutException(
'Effect ${effect.runtimeType} (id=${effect.id}) timed out after $appliedTimeout',
appliedTimeout,
);
if (!effect.isCompleted) {
effect.completeError(error);
}
throw error;
},
);
}