你如何根据你在Dart中无法控制的Stream返回Future?

时间:2014-04-09 04:42:19

标签: dart dart-async

我有一种情况,我期待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 个答案:

答案 0 :(得分:2)

为什么你不能依赖于streamSub.single?是因为可能有多条消息?

您的示例代码会在所有情况下选择第一个事件,因此要获得相同的行为,您可以使用window.onMessage.first代替window.onMessage.single。 如果没有第一个事件,它仍会导致错误(但我不认为DOM事件处理程序会发生这种情况 - 它们永远不会发送完成事件),否则它会给出一个完成第一个事件的未来事件

您还想提取事件数据,因此您可能需要:

return window.onMessage.first.then((event) {
  /* Logic goes here */
  popup.close();
  return event.data;
});