當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Dart Completer.sync用法及代碼示例


dart:async 庫中Completer.sync 的用法介紹如下。

用法:

Completer<T>.sync()

同步完成未來。

除非已知未來的完成是另一個異步操作的最終結果,否則應避免使用此構造函數。如果有疑問,請使用默認的 Completer 構造函數。

使用正常的異步完成程序永遠不會給出錯誤的行為,但是錯誤地使用同步完成程序可能會導致正確的程序中斷。

同步完成器僅用於在一個異步事件立即觸發另一個事件時優化事件傳播。除非保證對completecompleteError 的調用發生在不會破壞Future 不變量的地方,否則不應使用它。

同步完成意味著當在同步完成器上調用 completecompleteError 方法時,完成器的未來將立即完成,同步完成器也會調用在該未來上注冊的任何回調。

同步完成不能違反這樣的規則,即當您在未來添加回調時,在添加回調的代碼完成之前不得調用該回調。因此,同步完成隻能發生在另一個同步事件的最後(在"tail position"中),因為此時立即完成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().
});

相關用法


注:本文由純淨天空篩選整理自dart.dev大神的英文原創作品 Completer<T>.sync constructor。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。