【问题标题】:Convert Javascript callback to Dart future将 Javascript 回调转换为 Dart 未来
【发布时间】:2014-02-25 11:53:18
【问题描述】:

我正在尝试将以下 sn-p 从 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是什么对象?
  • 我会将其发布到问题中。

标签: javascript dart dart-async


【解决方案1】:

你调用sendMessageA,但这只是一个引用StreamController的字段,你想要调用SendMessage()。 您应该将 sendMessageA 设为私有 (_sendMessage) 并以小写字母 (Dart 样式 guid) 开头 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');
}

【讨论】:

  • 再次感谢您的帮助。
【解决方案2】:

我们也可以使用 Completers,因为它非常易于使用 使用方法和具体例子见DocAPI

【讨论】:

  • 完成器用于更复杂的用例。当您需要在一个地方返回未来并在另一个地方完成它(例如事件处理程序)时,它们非常有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-26
  • 2015-05-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-08
  • 2023-01-10
  • 1970-01-01
相关资源
最近更新 更多