9

次のように、JavaScript バックグラウンド イメージローダーを Dart に変換しました。

そして、タイマーを使用して、画像がすべて読み込まれたかどうかを確認します。これは正常に動作します。

しかし、Dart にはチェーン可能な Future があり、ImageElements のバックグラウンド読み込みをチェーンできるかどうか疑問に思っていました...

ImageElement a = new ImageElement();
ImageElement b = new ImageElement();
ImageElement c = new ImageElement();

Future.wait([a.src='a.jpg', b.src='b.jpg', c.src='ca.jpg'])
  .then((List responses) => chooseBestResponse(responses))
  .catchError((e) => handleError(e));

もちろん、srcの割り当てと実際の画像の読み込みは非同期であるため、これは機能しません...

また、イメージがロードされたら、各イメージに対して実行するコードも必要です。

独自の FutureImageElement クラスを作成する必要があるかもしれませんが、最初に質問すると思いました...

何か案は ?

4

2 に答える 2

24

もちろん先物も使えます。firstストリームのプロパティを使用するだけです:

var a = new ImageElement(src: 'a.png');
var b = new ImageElement(src: 'b.png');
var c = new ImageElement(src: 'c.png');

var futures = [a.onLoad.first, b.onLoad.first, c.onLoad.first];

Future.wait(futures).then((_) => print('done'));

3 つのイメージがすべて読み込まれると、「done」というテキストが出力されます。

于 2013-04-15T12:16:31.757 に答える
0

このためにFuturesと協力する必要は本当にありますか?

次のようなものではないのはなぜですか:

List<String> files = ["a", "b", "c"];
int imagesToLoad = files.length;
for (String fileName in files) {
    ImageElement pic = new ImageElement()
      ..src = "$fileName.jpg"
      ..onLoad.listen((Event e) {
          // do something when the file has finished loading

          imagesToLoad--;
          if (imagesToLoad == 0) {
            // do something when all images have loaded
          }
        })
    ;
}
于 2013-04-15T01:27:48.723 に答える