Completer<T>.sync 构造函数
同步完成未来。
除非已知未来的完成是另一个异步操作的最终结果,否则应避免使用此构造函数。如有疑问,请使用默认的 Completer 构造函数。
使用普通的、异步的 completer 永远不会产生错误行为,但错误地使用同步 completer 可能会导致其他正确的程序出错。
同步 completer 仅用于优化事件传播,当异步事件立即触发另一个事件时。除非保证在不会破坏 Future
不变量的地方调用 complete 和 completeError,否则不应使用它。
同步完成意味着当在同步 completer 上调用 complete 或 completeError 方法时,completer 的未来将立即完成,同时也会调用在该未来上注册的任何回调。
同步完成不能违反当你在未来上添加一个回调时,该回调必须在添加回调的代码完成之前被调用的规则。因此,同步完成必须只发生在另一个同步事件的末尾(在“尾部位置”),因为在这个点上,立即完成未来与返回到事件循环并在下一个微任务中完成未来是等效的。
示例
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>();