1

dart2js运行我的 chrome 扩展的编译版本时出现以下问题:

Uncaught TypeError: Object #<JsObject> has no method 'where$1'

我创建了一个最小的例子:

背景.dart

import 'dart:js';

void main() {
  print("main()...");
  context['js_list'] = new JsObject.jsify(["aaa", "bbb"]);
}

popup.dart

import 'dart:js';

var backgroundPage = context["chrome"]["extension"].callMethod("getBackgroundPage", []);

void main() {
  print("main():...");
  testJsList(backgroundPage['js_list']);
}

testJsList(List<String> jsList) {
  print("testJsList(): jsList = $jsList");
  print("testJsList(): ['aaa', 'bbb'] = ${new JsObject.jsify(['aaa', 'bbb'])}");
  jsList.where((e) => e == "bbb").forEach(print);
}

在 Chromium (Dartium) 上运行时:

main():...
testJsList(): jsList = [aaa, bbb]
testJsList(): ['aaa', 'bbb'] = [aaa, bbb]
bbb

在 Chrome (dart2js -> V8) 上运行时:

main():...
testJsList(): jsList = aaa,bbb
testJsList(): ['aaa', 'bbb'] = [aaa, bbb]
Uncaught TypeError: Object #<JsObject> has no method 'where$1'

显然,Dart VM 对待 JS Interop 的处理方式与编译后的 javascript 略有不同。打印方式不同,在第二种jsList情况下是“错误”类型的“jsList”。


更新: 看起来问题是由三重奏 {dart:js, dart2js, chrome API} 引起的,因为临时创建的 JsObject 在 Dartium 和 dart2js 场景中都可以正常工作。

4

1 回答 1

1

Dartium 和 dart2js 都有自己独立的 dart:js 实现,但它们的行为应该相同。在这种情况下,它看起来像 dart2js 实现中的一个错误,因为JsObject.jsify应该返回 a JsArraywhich implements List,但错误表明它返回的是一个普通的JsObject

您可以在 dartbug.com 上提交错误吗?

于 2014-02-24T04:18:06.670 回答