Dart流可以保存数据吗?

时间:2015-03-28 17:04:50

标签: asynchronous stream dart

我不清楚Dart中的单个订户流是否实际上保存了他们收到的数据。如果他们这样做,有没有办法禁用它,因为这似乎是一个主要的内存泄漏?

使用Dart中的new async*函数,执行这些存储数据生成的流吗?

2 个答案:

答案 0 :(得分:1)

StreamController构造函数上的code-doc说

  
      
  • 控制器将缓冲所有传入事件,直到订阅者
  •   
  • 注册。
  •   

为避免排队事件,您可以使用广播流

new StreamController.broadcast(...);

或暂停订阅

StreamSubscription sub;
sub = s.listen((e) {
  sub.pause();
  // process event
  sub.resume();
});

async*创建的流的行为相同

import 'dart:async';

Stream<int> a() async* {
  for (int i = 1; i <= 10; ++i) {
    print('yield $i');
    yield i;
  }
}

main() {

  a().listen((e) async {
    await new Future.delayed(const Duration(seconds: 1));
    print(e);
  });

  StreamSubscription sub;
  sub = a().listen((e) async {
    sub.pause();
    await new Future.delayed(const Duration(seconds: 1));
    print(e);
    sub.resume();
  });
}

尝试DartPad

第一个例子打印

yield 1
yield 2
yield 3
yield 4
yield 5
yield 6
yield 7
yield 8
yield 9
yield 10
1
2
3
4
5
6
7
8
9
10

第二个例子(带pause)打印

yield 1
yield 2
yield 3
1
2
yield 4
3
yield 5
4
yield 6
5
yield 7
6
yield 8
7
yield 9
8
yield 10
9
10

答案 1 :(得分:0)

我在提及单用户流时假设您的意思是Future

据我所知,新关键字不会改变实际行为。 async / async*将分别创建Future / Stream,这将自然缓冲数据,直到实际传递。例如,您可以同时执行这两项操作:

import 'dart:async';

Future single() async {
  return 42; 
}

main() async {
  int r = await single();
  print('ok: $r');

  single().then((int val) {
    print('val $val');
  });
}

所以最后我会说他们表现得一样,你只是以不同的方式表达你在做什么。因此,仅当有听众时,Stream才会获取数据。然后数据将像往常一样传送

来自他们网站的引用:可以使用Stream和联盟类手动实现流。异步生成器函数是用于实现此类流的糖