Событие с возвращаемым значением

Я использую библиотеку dart:async для обработки данных. Я добавляю объекты в StreamController, а другой модуль слушает поток. Теперь я хочу, чтобы другой модуль возвращал результат обработки обратно на вызов add (в будущем).

Вот пример кода, который должен иллюстрировать то, что я хочу сделать (это не работает, потому что метод add не возвращает будущее):

final controller = new StreamController();

controller.stream.listen((a) {
  // Do something with a, after that return something:
  return 42;
});

final aFuture = controller.add(new A());

aFuture.then((result) {
  // result == 42
});

Возможно ли что-то подобное с dart:async, другой библиотекой, или мне нужно писать свои собственные классы?

PS: Альтернативой может быть следующее, но было бы «сложнее» использовать простой возврат:

final controller = new StreamController();

controller.stream.listen((container) {
  // Do something with container.a, after that return something:

  container.completer.complete(42);
});


final completer = new Completer();
controller.add(new Container(new A(), completer));

completer.future.then((result) {
  // result == 42
});

person Fox32    schedule 27.06.2013    source источник


Ответы (1)


Вы можете использовать оболочку вокруг StreamController, например:

class StreamControllerWrapper{
  MessageBox mb;
  StreamController controller;
  StreamControllerWrapper(this.controller){
    mb = new MessageBox();
    controller.stream.listen((a) {
      var replyTo = a['replyTo'];
      // Do something with a, after that return something:
      replyTo.add(42);
    });
  }
  Future add(msg){
    Completer c = new Completer();
    mb.stream.listen((reply){
      c.complete(reply);
    });
    controller.add({'content':msg, 'replyTo':mb.sink});
    return c.future;
  }
}

А затем вызовите поведение следующим образом:

final controllerWrapper = new StreamControllerWrapper(new StreamController());
controllerWrapper.add(new A())
  .then((result){
    print(result);
  });
person Allan    schedule 27.06.2013
comment
Это похоже на второй способ, о котором я думал, но не то, что я ищу... - person Fox32; 27.06.2013