waitOperation method
Future<bool>
waitOperation(
- TransactionOperation? operation, {
- TransactionOperation? parentOperation,
- Duration timeout = const Duration(seconds: 40),
Waits operation
to be executed in this Transaction.
Implementation
Future<bool> waitOperation(TransactionOperation? operation,
{TransactionOperation? parentOperation,
Duration timeout = const Duration(seconds: 40)}) async {
if (operation == null) return false;
if (!identical(operation.transaction, this)) {
throw StateError(
"Operation from different transaction: ${operation.transaction.id} != $id");
}
if (!_operations.contains(operation)) {
throw StateError(
"Operation not in transaction:\n-- Operation> $operation\n-- $this");
}
if (_executedOperations.contains(operation)) {
return true;
}
// Avoid recursive loop:
if (parentOperation != null &&
parentOperation.isParentOperation(operation)) {
return false;
}
var initTime = DateTime.now();
while (_executedOperations.length < _operations.length) {
var elapsedTime = DateTime.now().difference(initTime);
var remainingTime = timeout - elapsedTime;
if (remainingTime.inMilliseconds <= 0) {
return false;
}
var completer =
_waitingExecutedOperation ??= Completer<TransactionOperation?>();
var executedOp =
await completer.future.timeout(remainingTime, onTimeout: () => null);
if (executedOp == operation) {
return true;
}
if (_executedOperations.contains(operation)) {
return true;
}
}
return _executedOperations.contains(operation);
}