Dart JS库,如何传递回调函数

2024-03-01

我们正在尝试使用 Dart 包装器来包装 D3 (v4) 行生成器类https://pub.dartlang.org/packages/js https://pub.dartlang.org/packages/js。我们已经关注了https://github.com/google/chartjs.dart/ https://github.com/google/chartjs.dart/但在传递函数时遇到问题。

我们的包装看起来像这样:

@JS('d3')
library d3;

import 'dart:js';
import "package:js/js.dart";


@JS('line')
class Line {
  external Line();
  external String call (List<List<num>> data);
  external Line x(Function func);
  external Line y(Function func);
}

目前我们已经成功地使用以下方法让它工作:

Line line = new Line();
String path = line([[10, 20], [200, 250]]);

然而,我们想设置一个函数来访问 x 和 y 值。 我们尝试过使用:

Line line = new Line();
line.x(allowInterop((d) { return d[0]+10;}));
line([[10, 20], [200, 250]]);

这会产生堆栈跟踪:

JSFunction._apply (dart:js:1300)
#1      JSFunction.call (dart:js:1290)
#2      CardinalLine.path (package:dials/app_component.dart:42:16)
#3      _View_AppComponent2.detectChangesInternal (package:dials/app_component.template.dart:189:49)
#4      AppView.detectChanges (package:angular2/src/core/linker/view.dart:247:10)
#5      DebugAppView.detectChanges (package:angular2/src/core/linker/view.dart:367:26)
#6      AppView.detectContentChildrenChanges (package:angular2/src/core/linker/view.dart:264:31)
#7      _View_AppComponent0.detectChangesInternal (package:dials/app_component.template.dart:118:10)
#8      AppView.detectChanges (package:angular2/src/core/linker/view.dart:247:10)
#9      DebugAppView.detectChanges (package:angular2/src/core/linker/view.dart:367:26)
#10     AppView.detectViewChildrenChanges (package:angular2/src/core/linker/view.dart:270:28)
#11     AppView.detectChangesInternal (package:angular2/src/core/linker/view.dart:259:10)
#12     AppView.detectChanges (package:angular2/src/core/linker/view.dart:247:10)
#13     DebugAppView.detectChanges (package:angular2/src/core/linker/view.dart:367:26)
#14     ViewRef_.detectChanges (package:angular2/src/core/linker/view_ref.dart:123:16)
#15     ApplicationRef_.tick.<anonymous closure> (package:angular2/src/core/application_ref.dart:443:63)
#16     List.forEach (dart:core-patch/growable_array.dart:254)
#17     ApplicationRef_.tick (package:angular2/src/core/application_ref.dart:443:32)
#18     ApplicationRef_._loadComponent (package:angular2/src/core/application_ref.dart:414:10)
#19     ApplicationRef_.bootstrap.<anonymous closure> (package:angular2/src/core/application_ref.dart:401:12)
#20     ApplicationRef_.run.<anonymous closure> (package:angular2/src/core/application_ref.dart:366:26)

这似乎是在尝试将参数传递给某些东西时发生的:

ORIGINAL EXCEPTION: V8 Exception(anonymous function) @ VM3533:1
VM3533:1 ORIGINAL STACKTRACE:(anonymous function) @ VM3533:1

其中 VM3533 是:

(function() {
    var func = this;
    return function() {
        return func(Array.prototype.slice.apply(arguments));
    }
    ;
}
)

传递的参数是:

[[MutationRecord], MutationObserver]

其中突变记录包括:

0: MutationRecord
addedNodes: NodeList[0]
attributeName: "hidden"
attributeNamespace: null
nextSibling: null
oldValue: null
previousSibling: null
removedNodes: NodeList[0]
target: div
type: "attributes"
__proto__: MutationRecord
length: 1
__proto__: Array[0]

我们尝试了很多变体,包括遵循 Chartjs 示例,但它们都以相同的堆栈跟踪结束。这样做的正确方法是什么?


所以事实证明该函数被正确附加和调用,问题在于我定义了仅使用一个变量 d 调用的 x 方法。

这就是大多数 D3 访问器函数在 JavaScript 中的定义方式,您只关心当前正在修改的数据片段。然而D3总是传递三个变量,即数据块d, 索引i,以及整个数据集data。 JavaScript 并不关心该函数是否接受额外的参数,它只是使用一个参数来调用它。然而达特does小心,并且会抛出一个不稳定的错误,表明由于参数过载而无法应用该函数。这是VM3533 中发生的异常。

抛出的异常非常模糊,如果不调试 JavaScript 就很难看到。

因此,正确的解决方案是确保当您定义将从 JavaScript 调用的函数时,该函数具有在此上下文中调用时所使用的确切参数数量。

在这种情况下:

Line line = new Line();
line.x(
    allowInterop(
        (List<num> d, num i, List<List<num>> data) {
            return d[0]+10;
        }
    )
);
return line([[10, 20], [30, 40]]);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Dart JS库,如何传递回调函数 的相关文章

随机推荐

  • 我应该将 Eclipse 插件片段的测试代码放在哪里?

    我在搜索 Eclipse 插件测试代码放置位置的最佳实践时发现了几篇文章 他们中的大多数人建议像这样的片段this http rcpquickstart wordpress com 2007 06 20 unit testing plug
  • 如何在 MySQL LIKE 子句中使用用户变量?

    我正在尝试设置一些简单的 SQL 脚本来帮助进行一些短期数据库管理 因此 我正在设置变量以尝试更轻松地重用这些脚本 我遇到的问题具体与 LIKE 子句有关 SET email email protected cdn cgi l email
  • Ruby 是否使用 $stdout 来写入 put 和 return 的输出?

    我想知道 Ruby 使用输出流在命令行打印这些内容 irb main 001 0 gt a test gt test irb main 002 0 gt puts a test gt nil irb main 003 0 gt a gt t
  • 实例 ID 服务是否会在应用升级时启动回调 onTokenRefresh()?

    实例 ID 服务是否会在应用升级时启动回调 onTokenRefresh 参考doc https developers google com instance id 指出 令牌是唯一且安全的 但如果出现安全问题或用户在设备恢复期间卸载并重新
  • 编写 TypeScript 并为浏览器和节点生成一个库

    我有一个在 Node js 和浏览器中使用的内部库 它有许多文件 与 Grunt 任务和不同的序言连接在一起 一个用于浏览器 一个用于 Node browser dependent 3rd party libs like Mustache
  • 一个视图连接到多个模型

    我有以下问题 MyView它连接到两个视图 TaskModel and UserModel TaskModel id 1 taskName myTask creatorName myName creator id 2 UserModel i
  • 多键多值非确定性Python字典

    已经有一个多键字典 https pypi python org pypi multi key dict 1 0 2在 python 中 也是一个多值字典 我需要一个 python 字典 它既是 example probabilistical
  • JNI 错误(应用程序错误):本地引用表溢出(最大值 = 512)

    我正在尝试运行LibSVMAndroid分类 https github com spencerimp LibsvmAndroidClassification带有我自己的数据集的 Android 项目 它与已提供的数据集配合得很好 当我使用
  • 在 Docker 中使用 RabbitMQ 删除容器

    我尝试使用RabbitMQ启动Docker容器 结果下载了镜像 但容器没有启动 我在日志中收到以下消息 error RABBITMQ DEFAULT PASS is set but deprecated error RABBITMQ DEF
  • 如何将变量传递给“data-target=”角度2

    我正在使用 Angular 2 Typescript 我想创建一个切换折叠列表 这很简单 只需一个 id 即可data target但我循环遍历一个列表 所以我有动态 ID 名称 我想在我的中传递一个变量data target这样我就可以获
  • 如何在 AvalonEdit 中使文本居中?

    我正在使用 ICSharpCode 的 AvalonEdit 文本编辑器 并且有一个自定义 DocumentColorizingTransformer 我想将 ColorizeLine 内的某些文本行居中 这可能吗 我已经能够弄清楚如何以我
  • 创建 deps.edn 文件时出现问题

    大家 我决定完全重写这篇文章 以清晰的方式展示它 首先感谢大家的支持 我很感激 这是 The Clojure Workshop Packt 中的练习 我陷入了困境 我的 IDE 是 IntelliJ 我使用的是 Windows 练习 4 1
  • 正确的 chromium 浏览器品牌?

    我正在研究 Chromium 叉子 如何替换 Chromium 资源和应用程序包 资源 我发现有一天android branding res dirsgn 参数是介绍 https chromium googlesource com chro
  • 没有窗口对象存在 webpack nodejs

    我使用 webpack 和 babel 来编译我的 ecmascript 6 代码 一切正常 但如果我添加某些依赖项 例如 requests npm 包 这是我的文件 main js import os from os export cla
  • 在 Info.plist 中指定设备系列

    有没有一种方法可以仅根据 Info plist 中的键来指定设备系列 而不更改构建设置 我读过有关 UIDeviceFamily 在构建时自动添加到 Info plist 的信息 并且文档说我不应该手动添加此键 假设我无法使用 Xcode
  • Makefile 中 TARGET_ARCH 变量的用途是什么

    我注意到 Gnu Make 中的隐式规则是变量 TARGET ARCH 例如 LINK o LOADLIBES LDLIBS o LINK o CC LDFLAGS TARGET ARCH 我认为交叉编译需要这个变量 但我在 Gnu Mak
  • 使用带有绝对链接的 dompdf

    我正在使用标准 DOMPDF 代码来呈现现有网页 例如1 http jasss soc surrey ac uk 16 2 1 html dompdf new DOMPDF dompdf gt set base path artpath d
  • 将外部 CSS 转换为 Rails 中邮件的内联 CSS

    我正在尝试创建一个应用程序 该应用程序将发送样式繁重的电子邮件 并要求客户端工作 Google Gmail 除外 我研究了这个问题 看起来 Gmail 删除了外部文件中的 CSS 或嵌套在 style 标签中的 CSS 是否存在将样式从外部
  • 如何找出哪个 USB-RS232 设备位于哪个 tty 上?

    我有两个基于相同 USB RS232 芯片的不同 USB 设备 当我将它们插入 USB 时 它们会安装到 dev ttyUSB0 3 我的问题是 在脚本中 我如何找出哪个脚本位于哪个 tty 上 使用 lsusb 我可以区分它们 gt ls
  • Dart JS库,如何传递回调函数

    我们正在尝试使用 Dart 包装器来包装 D3 v4 行生成器类https pub dartlang org packages js https pub dartlang org packages js 我们已经关注了https githu