How do I create an anonymous JavaScript function/callback with Dart's JS interop?

孤街醉人 提交于 2019-12-04 03:33:16

问题


I am using Dart and its JS interop. I need to convert the following JavaScript code to 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)
});

Note the anonymous callback as the second parameter to loadTags. How do I create that with Dart and the dart:js library?

The closest I got was creating a named function with:

  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;
    }
  };

And then using this Dart code:

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

However, I don't want to create the named function. Any ideas or tips?


回答1:


Dart closures are automatically converted to JS closures when sent across the border. You can just do this:

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})
]);


来源:https://stackoverflow.com/questions/22799289/how-do-i-create-an-anonymous-javascript-function-callback-with-darts-js-interop

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!