将Javascript回调转换为Dart future

时间:2014-02-01 20:00:53

标签: javascript dart dart-async

我正在尝试将以下代码段从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将被打印,但不会返回任何未来值。

2 个答案:

答案 0 :(得分:1)

您致电sendMessageA,但这只是一个引用StreamController的字段,您想要的是致电SendMessage()。 您应该sendMessageA私有(_sendMessage)并以小写字母(Dart样式guid)开始SendMessage,然后致电sendMessage(),将fn添加到{{ 1}}。

尝试了以下代码并且工作了。

_sendMessage

答案 1 :(得分:1)

我们也可以使用Completers,因为它非常容易使用 请参阅文档API了解如何使用和具体示例