Как вы возвращаете 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;
});