Имитация цикла ответа на запрос в асинхронном дротике - PullRequest
0 голосов
/ 08 мая 2019

Я знаю, что потоки дротиков предоставляют довольно простой способ "отправлять" запросы работнику: -

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 и т. д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...