Функция runZoned< R>
- R body( ),
- {Map<
Object?, Object?>? zoneValues, - ZoneSpecification? zoneSpecification,
- @Deprecated("Use runZonedGuarded instead") Function? onError}
Выполняет body в своей собственной зоне.
Создаёт новую зону с помощью Zone.fork на основе zoneSpecification и zoneValues, затем выполняет body в этой зоне и возвращает результат.
Если onError предоставлено, оно должно иметь один из типов
void Function(Object)-
void Function(Object, StackTrace)и обработчикonErrorиспользуется как для обработки асинхронных ошибок путём переопределения ZoneSpecification.handleUncaughtError вzoneSpecification, если таковые есть, так и для обработки ошибок, возникающих синхронно при вызовеbody.
Если возникает ошибка синхронно в body, то бросок в обработчике onError заставляет вызов runZone сгенерировать эту ошибку, а в противном случае вызов runZoned пытается вернуть null.
Если спецификация зоны имеет значение handleUncaughtError или параметр onError предоставлен, зона становится зоной обработки ошибок.
Ошибки никогда не пересекают границы зон обработки ошибок самостоятельно. Ошибки, пытающиеся пересечь границы зон обработки ошибок, считаются необработанными в исходной зоне обработки ошибок.
var future = Future.value(499);
runZoned(() {
var future2 = future.then((_) { throw "error in first error-zone"; });
runZoned(() {
var future3 = future2.catchError((e) { print("Never reached!"); });
}, onError: (e, s) { print("unused error handler"); });
}, onError: (e, s) { print("catches error of first error-zone."); }); Пример:
runZoned(() {
Future(() { throw "asynchronous error"; });
}, onError: (e, s) => print(e)); // Will print "asynchronous error". Возможна ручная передача ошибки из одной зоны обработки ошибок в другую путём повторного броска ошибки в новой зоне. Если onError сгенерирует ошибку, эта ошибка возникнет в исходной зоне, где был вызван runZoned.
Реализация
R runZoned<R>(R body(),
{Map<Object?, Object?>? zoneValues,
ZoneSpecification? zoneSpecification,
@Deprecated("Use runZonedGuarded instead") Function? onError}) {
checkNotNullable(body, "body");
if (onError != null) {
// TODO: Remove this when code have been migrated off using [onError].
if (onError is! void Function(Object, StackTrace)) {
if (onError is void Function(Object)) {
var originalOnError = onError;
onError = (Object error, StackTrace stack) => originalOnError(error);
} else {
throw ArgumentError.value(onError, "onError",
"Must be Function(Object) or Function(Object, StackTrace)");
}
}
return runZonedGuarded(body, onError,
zoneSpecification: zoneSpecification, zoneValues: zoneValues) as R;
}
return _runZoned<R>(body, zoneValues, zoneSpecification);
}
© 2012 the Dart project authors
Licensed under the BSD 3-Clause "New" or "Revised" License.
https://api.dart.dev/stable/2.18.5/dart-async/runZoned.html