Конструктор фабрики Completer.sync
Completer.sync(Синхронно завершает будущее.
От этого конструктора следует воздержаться, если известно, что завершение будущего — это конечный результат другой асинхронной операции. В случае сомнений используйте конструктор Completer по умолчанию.
Использование обычного, асинхронного, комплитера никогда не приведет к неправильному поведению, но неправильное использование синхронного комплитера может привести к поломке, в противном случае, корректных программ.
Синхронный комплитер предназначен только для оптимизации распространения событий, когда одно асинхронное событие немедленно вызывает другое. Его не следует использовать, если вызовы complete и completeError гарантированно происходят в местах, где это не нарушит Future инвариантов.
Синхронное завершение означает, что будущее комплитера будет завершено немедленно при вызове метода complete или completeError на синхронном комплитере, что также вызывает все зарегистрированные обратные вызовы на этом будущем.
Синхронное завершение не должно нарушать правило, что когда вы добавляете обратный вызов на будущее, этот обратный вызов не должен вызываться до тех пор, пока код, который добавил обратный вызов, не будет завершен. По этой причине синхронное завершение должно происходить только в самом конце (в «хвостовой позиции») другого синхронного события, потому что в этот момент немедленное завершение будущего эквивалентно возврату в цикл событий и завершению будущего в следующей микрозадаче.
Пример:
var completer = new Completer.sync();
// The completion is the result of the asynchronous onDone event.
// No other operation is performed after the completion. It is safe
// to use the Completer.sync constructor.
stream.listen(print, onDone: () { completer.complete("done"); });
Плохой пример. Не используйте этот код. Только для иллюстрации:
var completer = new Completer.sync();
completer.future.then((_) { bar(); });
// The completion is the result of the asynchronous onDone event.
// However, there is still code executed after the completion. This
// operation is *not* safe.
stream.listen(print, onDone: () {
completer.complete("done");
foo(); // In this case, foo() runs after bar().
});
Исходный код
factory Completer.sync() => new _SyncCompleter<T>();
© 2012 the Dart project authors
Licensed under the Creative Commons Attribution-ShareAlike License v4.0.
https://api.dartlang.org/stable/1.24.3/dart-async/Completer/Completer.sync.html