【问题标题】:How do I create an anonymous JavaScript function/callback with Dart's JS interop?如何使用 Dart 的 JS 互操作创建匿名 JavaScript 函数/回调?
【发布时间】:2014-04-02 00:13:21
【问题描述】:

我正在使用 Dart 及其 JS interop。我需要将以下 JavaScript 代码转换为 Dart:

ID3.loadTags("filename.mp3", function() {
  var tags = ID3.getAllTags("filename.mp3");
  if (tags.artist)
    artist.textContent = tags.artist;
  if (tags.title)
    track.textContent = tags.title;
}, {
  dataReader: FileAPIReader(file)
});

注意匿名回调作为loadTags 的第二个参数。如何使用 Dart 和 dart:js 库创建它?

我得到的最接近的是创建一个命名函数:

  js.context['loadTagsCallback'] = () {
    var tags = ID3.callMethod('getAllTags', ["filename.mp3"]);
    var artistTag = tags['artist'];
    var titleTag = tags['title'];

    if (artistTag != null) {
      artist.text = artistTag;
    }

    if (titleTag != null) {
      track.text = titleTag;
    }
  };

然后使用这个 Dart 代码:

ID3.callMethod('loadTags', [
    "filename.mp3",
    js.context['loadTagsCallback'],
    new js.JsObject.jsify({'dataReader': id3FileReader})
]);

但是,我不想创建命名函数。有什么想法或提示吗?

【问题讨论】:

    标签: dart dart-js-interop


    【解决方案1】:

    Dart 闭包在越界发送时会自动转换为 JS 闭包。你可以这样做:

    ID3.callMethod('loadTags', ["filename.mp3", () {
        var tags = ID3.callMethod('getAllTags', ["filename.mp3"]);
        var artistTag = tags['artist'];
        var titleTag = tags['title'];
    
        if (artistTag != null) {
          artist.text = artistTag;
        }
    
        if (titleTag != null) {
          track.text = titleTag;
        }
      },
      new js.JsObject.jsify({'dataReader': id3FileReader})
    ]);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-24
      • 2014-05-05
      • 2013-07-15
      • 1970-01-01
      • 2019-02-16
      相关资源
      最近更新 更多