如何使用Dart的JS互操作创建匿名JavaScript函数/回调?

Set*_*add 4 dart dart-js-interop

我正在使用Dart和它的JS互操作.我需要将以下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)
});
Run Code Online (Sandbox Code Playgroud)

请注意匿名回调作为第二个参数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;
    }
  };
Run Code Online (Sandbox Code Playgroud)

然后使用这个Dart代码:

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

但是,我不想创建命名函数.任何想法或提示?

Jus*_*ani 6

通过边界发送时,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})
]);
Run Code Online (Sandbox Code Playgroud)