将Javascript回调转换为Dart Future

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被打印出来了,但是没有返回未来的值。


你尝试过哪些代码?另外,self是什么类型的对象? - Bergi
我会把它发布到问题中。 - basheps
2个回答

1
你调用了sendMessageA,但它只是一个指向StreamController的字段,你想要调用的是SendMessage()。你应该将sendMessageA设置为私有(_sendMessage),并以小写字母(Dart风格指南)开头编写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');
}

再次感谢您的帮助。 - basheps

1

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


1
Completers 适用于更复杂的用例。当您需要在一个地方返回一个 future 并在另一个地方(例如事件处理程序)完成它时,它们非常有用。 - Günter Zöchbauer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接