3

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

4

2 回答 2

1

我们还可以使用 Completers,因为它非常易于使用,请参阅 Doc API了解如何使用和具体示例

于 2014-08-14T17:32:06.253 回答
1

你打电话sendMessageA,但这只是一个引用的字段,StreamController你想要的是调用SendMessage()。您应该设为sendMessageA私有 ( _sendMessage) 并SendMessage以小写字母开头(Dart 风格的 guid),然后调用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');
}
于 2014-02-01T21:25:25.817 回答