1

我有一种情况,我期望 a 有一个值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不需要中介?

4

1 回答 1

2

为什么你不能依赖调用streamSub.single?是因为可能有不止一条消息吗?

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

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

return window.onMessage.first.then((event) {
  /* Logic goes here */
  popup.close();
  return event.data;
});
于 2014-04-09T05:26:17.643 回答