2013-06-27 3 views
0

Я использую библиотеку dart:async, чтобы выполнить некоторую обработку данных. Я добавляю объекты к StreamController, а другой модуль прослушивает поток. Теперь я хочу, чтобы другой модуль возвращал результат обработки обратно на вызов 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 
}); 

ответ

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); 
    }); 
+0

, который похож на второй, как я думал об этом, но нет t, что я ищу ... – Fox32