Преобразование обратного вызова Javascript в будущее Dart

Я пытаюсь преобразовать следующий фрагмент из Node.js в Dart.

 self.emit('send_message_A', foo, bar, function(opt1, opt2) {
   var avar= self.getSomeValue(foo, bar, opt1, opt2);

   if(self.someCondition)
     self.emit('send_message_B', foo, bar, avar);
 });

Любая помощь приветствуется. Заранее спасибо.

Изменить. Пока я пробовал:

typedef Future Next(String opt1, String opt2);

class Sender {
  Stream<Next> get onSendMessageA => sendMessageA.stream;
  final sendMessageA = new StreamController<Next>.broadcast();

  SendMessage(fn) => sendMessageA.add(fn);
}

main() {
  var sender = new Sender()
    ..onSendMessageA.listen((f) => f('option1', 'option2'))
      .asFuture().then((value) => print('value: $value'));

  Future<String> fn(String opt1, String opt2) {
    print('opt1: $opt1');
    print('opt2: $opt2');
    return new Future.value('$opt1 - $opt2');
  };

  sender.sendMessageA(fn);
}

Варианты 1 и 2 печатаются, но будущее значение не возвращается.


person basheps    schedule 01.02.2014    source источник
comment
Какой код у вы пробовали? Кроме того, что это за объект self?   -  person Bergi    schedule 02.02.2014
comment
Выложу на вопрос.   -  person basheps    schedule 02.02.2014


Ответы (2)


Вы вызываете sendMessageA, но это только поле, которое ссылается на StreamController, вы хотите вызвать SendMessage(). Вы должны сделать sendMessageA частным (_sendMessage) и начать SendMessage со строчной буквы (идентификатор стиля Дарт), а затем вызвать sendMessage(), который добавляет fn к _sendMessage.

Пробовал следующий код и работал.

library x;

import 'dart:async';

typedef Future<String> Next(String opt1, String opt2);

class Sender {
  Stream<Next> get onSendMessageA => _sendMessageA.stream;
  final _sendMessageA = new StreamController<Next>.broadcast();

  sendMessage(fn) => _sendMessageA.add(fn);
}

void main(List<String> args) {
  var sender = new Sender()
    ..onSendMessageA.listen((f) {
      f('option1', 'option2')
      .then((value) => print('value: $value'));
    });


  sender.sendMessage(fn);
}

Future<String> fn(String opt1, String opt2) {
  print('opt1: $opt1');
  print('opt2: $opt2');
  return new Future.value('$opt1 - $opt2');
}
person Günter Zöchbauer    schedule 01.02.2014
comment
В очередной раз благодарим за помощь. - person basheps; 02.02.2014

Мы также можем использовать Completers, так как его очень легко использовать. См. Документ API о том, как использовать, и конкретные примеры

person youssef    schedule 14.08.2014
comment
Завершители предназначены для более сложных случаев использования. Они очень полезны, когда вам нужно вернуть будущее в одном месте и завершить его в другом месте (например, обработчик событий). - person Günter Zöchbauer; 14.08.2014