Получение будущего от загрузки ImageElement

Это продолжение статьи Использование фьючерсов для асинхронной загрузки

Моя программа 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 для каждого и использовать Future.wait, чтобы дождаться их готовности.

Однако загрузка изображений, как указано выше, не использует фьючерсы, она использует StreamSubscription, поэтому я не могу ждать возврата от этой функции.

Как я могу получить будущий объект, который сообщит мне, когда моя текстура будет создана? Могу ли я создать свой собственный объект Future и "сигнализировать" об этом в обратном вызове? Если я могу это сделать, мне совсем не ясно из документации, как я это делаю.


person jcoder    schedule 29.12.2013    source источник


Ответы (2)


Вы действительно можете «сигнализировать», что будущее завершено, вручную.

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

person Paul Collingwood    schedule 29.12.2013
comment
Ах, полный класс, я это пропустил. Я пытался напрямую создать будущее. Спасибо. - person jcoder; 29.12.2013

Вы можете использовать свойство Future<T> first класса Stream. 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";
person Xavier    schedule 30.12.2013