Completer<T>.sync构造函数

Completer<T>.sync()

同步完成future。

除非已知future的完成是其他异步操作的最后结果,否则应避免使用此构造函数。如果有疑问,请使用默认的 Completer 构造函数。

使用普通的、异步的Completer永远不会导致错误行为,但错误地使用同步Completer可能会导致正确的程序出现崩溃。

同步Completer仅用于优化一个异步事件立即触发另一个事件时的事件传播。除非确保在不会破坏《Future》不变性的地方调用completecompleteError方法,否则不应使用。

同步完成意味着,在同步Completer上调用completecompleteError方法时,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>();