Как вы возвращаете Future на основе потока, который вы не контролируете в Dart?

У меня есть ситуация, когда я ожидаю одно значение от Stream, но так как он предоставляется браузером, я не могу рассчитывать на простой вызов streamSub.single, В настоящее время я создаю явное StreamController так что я могу легко сгенерировать Future от этого, гарантируя, что он получит только один ответ. Тем не менее, это оказывается намного больше, чем я ожидал настроить, заставляя меня думать, что я что-то упустил. Текущий код выглядит следующим образом:

StreamController<String> streamCtrlr = new StreamController<String>();
var popup = window.open(targetUrl, "Auth Window"); 
//The popup above will call window.opener.postMessage, so listen for messages
StreamSubscription sub = window.onMessage.listen(null);
sub.onData((Event){
  /* Logic goes here */
  sub.cancel();
  popup.close();
  streamCtrlr.add(Event.data);
  streamCtrlr.close();
});  
return streamCtrlr.stream.single;

Как это можно переписать так, чтобы посредник StreamController не требуется?

1 ответ

Решение

Почему ты не можешь положиться на звонок streamSub.single? Это потому, что может быть более одного сообщения?

Ваш пример кода выбирает первое событие во всех случаях, поэтому, чтобы получить то же поведение, вы можете использовать window.onMessage.first вместо window.onMessage.single, Это все равно вызовет ошибку, если не будет первого события (но я не думаю, что это может случиться с обработчиками событий DOM - они никогда не отправят событие done), и в противном случае это даст будущее, которое будет завершено первым событием.

Вы также хотите извлечь данные о событии, поэтому вы, вероятно, захотите:

return window.onMessage.first.then((event) {
  /* Logic goes here */
  popup.close();
  return event.data;
});
Другие вопросы по тегам