Completer<T>.sync 构造函数
同步完成future。
除非已知future的完成是其他异步操作的最后结果,否则应避免使用此构造函数。如果有疑问,请使用默认的 Completer 构造函数。
使用普通的、异步的Completer永远不会导致错误行为,但错误地使用同步Completer可能会导致正确的程序出现崩溃。
同步Completer仅用于优化一个异步事件立即触发另一个事件时的事件传播。除非确保在不会破坏《Future》不变性的地方调用complete
和completeError
方法,否则不应使用。
同步完成意味着,在同步Completer上调用complete
或completeError
方法时,Completer的future将立即完成,同时也调用在该future上注册的任何回调。
同步完成必须遵守以下规则:当你在一个future上添加一个回调时,该回调必须在添加它的代码完成后才能调用。因此,同步完成必须发生在另一个同步事件的最后一个动作(在“尾递归”位置),因为此时,立即完成future等同于回退到事件循环并在下一个微任务中完成future。
示例
var completer = 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 = 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>();