3

Lawndart ライブラリを使用してブラウザー データにアクセスしており、一連のクエリの結果を収集したいと考えています。これが私がうまくいくと思ったものです:

  numberOfRecordsPerSection(callback) {
    var map = new Map();

    db_sections.keys().forEach((_key) {
      db_sections.getByKey(_key).then((Map _section) {
        int count = _section.length;
        map[_key] = count;
      });
    }).then(callback(map));
  }

ただし、コールバックが呼び出されたときmapはまだ空です (正しく入力されますが、後ですべての Future が完了した後で)。問題は、呼び出しによって作成されたgetByKey()先物が、呼び出しによって作成された先物によって「キャプチャ」されていないことだと思いforEach()ます。

結果を正しく取得するためにコードを修正するにはどうすればよいですか?

4

1 に答える 1

3

ダーツでこのjqueryパターンを行うにはどうすればよいですか?のコード あなたにとてもよく似ています

Future の各エントリが_db.keys()配列に追加され、すべてが終了するのを待ちますFuture.wait()

このコードが機能するかどうかは不明です (リンクされた質問の回答に関するコメントを参照してください)

void fnA() {
    fnB().then((_) {
        // Here, all keys should have been loaded
    });
}

Future fnB() {
  return _db.open().then((_) {
    List<Future> futures = [];
    return _db.keys().forEach((String key_name) { 
      futures.add(_db.getByKey(key_name).then((String data) {
        // do something with data
        return data;
      }));
    }).then((_) => Future.wait(futures));
  });
}
于 2014-05-31T12:06:50.860 に答える