14
Future readData() {
    var completer = new Completer();
    print("querying");
    pool.query('select p.id, p.name, p.age, t.name, t.species '
        'from people p '
        'left join pets t on t.owner_id = p.id').then((result) {
      print("got results");
      for (var row in result) {
        if (row[3] == null) {
          print("ID: ${row[0]}, Name: ${row[1]}, Age: ${row[2]}, No Pets");
        } else {
          print("ID: ${row[0]}, Name: ${row[1]}, Age: ${row[2]}, Pet Name: ${row[3]},     Pet Species ${row[4]}");
        }
      }
      completer.complete(null);
    });
    return completer.future;
  }

上記は、githubSQLJockyConnectorから取得したサンプルコードです。

可能であれば、pool.queryの外部でコンプリーターオブジェクトが作成された関数が関数completer.complete(null)を呼び出している理由を誰かに説明してもらいたいと思います。

つまり、印刷実行後の部分がわかりません。

注:可能であれば、将来およびコンプリーターがDB操作と非DB操作の両方の実用的な目的でどのように使用されるかについても知りたいと思います。

私は次のリンクを探索しました: FutureとCompleterに関するGoogleグループのディスカッション

および以下に示すAPIリファレンスドキュメント 。CompleterAPIリファレンスおよびFutureAPIリファレンス

4

3 に答える 3

26

そのメソッドによって返される Future オブジェクトは、ある意味で、「将来」のある時点で完了する完了オブジェクトに接続されています。.complete() メソッドは Completer で呼び出され、それが完了したことを Future に通知します。より単純化された例を次に示します。

Future<String> someFutureResult(){
   final c = new Completer();
   // complete will be called in 3 seconds by the timer.
   new Timer(3000, (_) => c.complete("you should see me second"));
   return c.future;
}

main(){
   someFutureResult().then((String result) => print('$result'));
   print("you should see me first");
}

先物が役立つ他のシナリオについて詳しく説明しているブログ投稿へのリンクを次に示します。

于 2012-12-05T21:17:35.607 に答える
3

Completer は、Future に値を提供し、Future にアタッチされている残りのコールバックと継続を起動するようにシグナルを送るために使用されます (つまり、呼び出しサイト/ユーザー コードで)。

これcompleter.complete(null)は、非同期操作が完了したことを将来に知らせるために使用されるものです。complete の API は、引数を 1 つ指定する必要があることを示しています (つまり、オプションではありません)。

void complete(T value)

このコードは値を返すことに関心がなく、操作が完了したことを呼び出しサイトに通知するだけです。印刷されるだけなので、コンソールで出力を確認する必要があります。

于 2012-12-05T21:17:48.073 に答える
3

正解は DartPad にエラーがあり、その理由は Dart のバージョンである可能性があります。

error : The argument type 'int' can't be assigned to the parameter type 'Duration'.
error : The argument type '(dynamic) → void' can't be assigned to the parameter type '() → void'.

次のスニペットは補足です

import 'dart:async';

Future<dynamic> someFutureResult(){
   final c = new Completer();
   // complete will be called in 3 seconds by the timer.
   new Timer(Duration(seconds: 3), () {     
       print("Yeah, this line is printed after 3 seconds");
       c.complete("you should see me final");       
   });
   return c.future;

}

main(){
   someFutureResult().then((dynamic result) => print('$result'));
   print("you should see me first");
}

結果

you should see me first
Yeah, this line is printed after 3 seconds
you should see me final
于 2019-06-14T04:09:57.010 に答える