我知道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请求等),这被证明是必不可少的。