在异步Dart中模拟请求回复循环

时间:2019-05-08 13:12:33

标签: asynchronous dart

我知道dart流提供了一种相当简单的方法来“发送”请求给工作人员:-

import 'dart:async';

final sc = StreamController<int>();

Future<void> worker() async {
  await for (final req in sc.stream) {
    print("received request: $req");
    await Future.delayed(Duration(seconds: 1));
  }
}

void main() async {
 worker();
 sc.add(1);
 sc.add(2);
}

但是,这里缺少的是一种将回复从工作人员发送回客户的方法:-

虽然可以使用Completer来完成,就像这样:-

import 'dart:async';

class Request {
  final Completer completer;
  final int value;

  Request(this.value) : completer = Completer();
}

final sc = StreamController<Request>();

Future<void> worker() async {
  await for (final req in sc.stream) {
    await Future.delayed(Duration(seconds: 1));

    print("received request: ${req.value}");
    req.completer.complete(req.value * req.value);
  }
}

void main() async {
  worker();

  var req = Request(1);
  sc.add(req);
  var res = await req.completer.future;
  print("got response: $res");

  req = Request(2);
  sc.add(req);
  res = await req.completer.future;
  print("got response: $res");
}

我不禁怀疑是否有更好,更惯用的方式来实现这一目标。更有经验的人可以帮助我吗?

-

我为什么要这个? 我发现这种架构非常适合我的大脑。

此外,该模型使我非常容易地确保一次仅执行一项任务。

在某些情况下(例如从整个代码库中的多个位置写入单个文件,排队BLE GATT请求等),这被证明是必不可少的。

0 个答案:

没有答案