飞镖中的通道原语?

时间:2015-11-15 09:21:53

标签: dart dart-async

Dart中是否存在channel原语,例如Go中有?我找到的最接近的是StreamIterator

用例是允许消费者逐个异步处理值。此外,如果没有价值,它应该等待。

1 个答案:

答案 0 :(得分:1)

您可以使用流

执行此操作
import 'dart:async' show Stream, StreamController;

main() {
  StreamController<int> sc = new StreamController<int>();

  sc.stream.listen((e) => print(e));

  for(int i = 0; i < 10; i++) {
    sc.add(i);
  }
}

DartPad

中试用

另见

你不能等待&#34;在Dart中,尤其是在浏览器中。

Dart中还有async*个生成器函数可用于创建流。请参阅示例Async/Await feature in Dart 1.8

A&#34;天真&#34;翻译表格await for(var event in someStream)

import 'dart:async';

main() {
  StreamController<int> sc = new StreamController<int>();

  startProcessing(sc.stream);

  for(int i = 0; i < 10; i++) {
    sc.add(i);
  }
}

Future startProcessing(Stream stream) async {
  StreamSubscription subscr;
  subscr = stream.listen((value) {
    subscr.pause();
    new Future.delayed(new Duration(milliseconds: 500)).then((_) {
      print('Processed $value');
      subscr.resume();
    });
  });
  //await for(int value in stream) {
  //  await new Future.delayed(new Duration(milliseconds: 500)).then((_) {
  //    print('Processed $value');
  //  });
  //} 
}

实际实施采用不同的方法

  

实现await-for循环的方式使用单事件缓冲区(以避免重复暂停和恢复)。

请参阅https://github.com/dart-lang/sdk/issues/24956#issuecomment-157328619