2

这是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 所以我没有从这个函数中得到等待的未来。

我怎样才能得到一个让我知道我的纹理何时是创建者的未来对象?我可以创建自己的 Future 对象并在回调中“发出信号”吗?如果我能做到这一点,从文档中我根本不清楚我是如何做到的。

4

2 回答 2

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

于 2013-12-29T10:40:50.623 回答
1

您可以使用Future<T> firstStream 类的属性。 https://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";
于 2013-12-30T20:08:41.077 回答