从ImageElement加载获取未来

时间:2013-12-29 10:36:57

标签: webgl dart dart-async

这是Use of futures for async loading

的后续内容

我的WebGL / Dart程序在初始化时需要创建大量的opengl数据。它全部异步加载并使用期货在加载时处理数据并知道何时加载了所有必需的数据。

我在加载纹理方面遇到了麻烦。我有这个代码 -

ImageElement img = new ImageElement();
img.onLoad.listen((e) {
  baseTexture = gl.createTexture();
  gl.bindTexture(TEXTURE_2D, baseTexture);
  gl.texImage2DImage(TEXTURE_2D, 0, RGBA, RGBA, UNSIGNED_BYTE, img);
  gl.texParameteri(TEXTURE_2D, TEXTURE_MIN_FILTER, LINEAR);
  gl.texParameteri(TEXTURE_2D, TEXTURE_MAG_FILTER, LINEAR);
});

img.src = "base.png";

这很好用。它加载图像并在图像到达时从中生成纹理。 但是我需要我的主程序知道我的所有纹理何时到达。基于前一个问题,我应该为每个问题使用一个未来,并使用Future.wait等待它们全部准备就绪。

然而,如上所述加载图像并不使用期货,它使用了StreamSubscription,因此我无法从此函数返回等待。

如果我的纹理是creater,我怎样才能获得一个让我知道的未来对象? 我可以创建自己的Future对象吗" signal"它在回调?如果我能做到这一点,那么从文档中我并不清楚我是如何做到这一点的。

2 个答案:

答案 0 :(得分:4)

您确实可以“发出信号”表示未来是手动完成的。

Future<Results> costlyQuery() {
  var completer = new Completer();

  database.query("SELECT * FROM giant_table", (results) {
    // when complete
    completer.complete(results);
  });

  // this returns essentially immediately,
  // before query is finished
  return completer.future; 
}

执行completer.complete(results);时,未来就完成了。

从这里开始:http://blog.sethladd.com/2012/03/using-futures-in-dart-for-better-async.html

答案 1 :(得分:1)

您可以使用Stream类的属性Future<T> firsthttps://api.dartlang.org/docs/channels/stable/latest/dart_async/Stream.html#first

ImageElement img = new ImageElement();
Future future = img.onLoad.first.then((e) {
   ...
});
img.src = "base.png";