在dart中使用EasyRTC:类'Proxy'没有实例getter'iterator'

时间:2014-05-18 12:57:54

标签: node.js dart dartium

作为一项实验,我用dart和easyrtc尝试了一些东西。我开始将this(通常通过nodejs服务器,发现here)移植到dart版本,这就是我用它制作的

编辑:我发现代码的哪一部分导致了错误。它是for循环无法运行的数据对象代理。通常,setRoomOccupantListener函数提供房间名称和一个对象,其中所有对等体都连接到房间。我在普通的javascript中制作了对象布局的截图,就像我在chrome中调试时看到的here

function connect() {
  easyrtc.setRoomOccupantListener(convertListToButtons);
 }

function convertListToButtons (roomName, data, isPrimary) {
  clearConnectList();
  var otherClientDiv = document.getElementById("otherClients");
  for(var easyrtcid in data) {
    var button = document.createElement("button");
    button.onclick = function(easyrtcid) {
      return function() {
        performCall(easyrtcid);
      };
    }(easyrtcid);

    var label = document.createTextNode(easyrtc.idToName(easyrtcid));
    button.appendChild(label);
    otherClientDiv.appendChild(button);
  }
}

here是我调试chrome中的dart代码时的屏幕截图

void connect() {
  easyrtc.setRoomOccupantListener(convertListToButtons);
  } 

void convertListToButtons(roomName, data, isPrimary) {
  clearConnectList();
  var otherClientDiv = querySelector("#otherClients");
  for (var easyrtcid in data) {
    var button = document.createElement("button");
    button.onClick.listen((event) {
      performCall(easyrtcid);
    });

    button.appendText(easyrtc.idToName(easyrtcid));
    otherClientDiv.append(button);
  }
}

这是我得到的错误:

Class 'Proxy' has no instance getter 'iterator'.

NoSuchMethodError: method not found: 'iterator' Receiver: Instance of 'Proxy' Arguments: []
#0      Object.noSuchMethod (dart:core-patch/object_patch.dart:45)
#1      P...<omitted>...7)

我在这里遗漏了一些简单的东西,还是这种不相容的东西?谢谢。

2 个答案:

答案 0 :(得分:1)

我看到你也可以使用import package:js/js.dart';。我不知道如何使用

你可以尝试

import 'dart:js' as js;

https://www.dartlang.org/articles/js-dart-interop/

这看起来很奇怪

easyrtc = js.context.easyrtc; // <== here you have context 'easyrtc'

easyrtc.easyApp('easyrtc.audioVideo', 'selfVideo', new js.JsObject.jsify(['callerVideo']), loginSuccess, loginFailure); 
// and here again 'easyrtc.audioVideo', I guess this is one to much

easyrtc.easyApp.callMethod('audioVideo', ['selfVideo', js.JsObject.jsify(['callerVideo']), loginSuccess, loginFailure]); 

其中'audioVideo'是被调用的方法,其余是参数

easyrtc.callMethod('easyApp', ['audioVideo', 'selfVideo', js.JsObject.jsify(['callerVideo']), loginSuccess, loginFailure]); 

其中'easyApp'是被调用的方法,其余的是参数。

如果您可以添加代码在JavaScript中的外观,我可以创建更好的示例。

答案 1 :(得分:1)

dart:js package:js不直接处理Dart列表。所以以下一行:

  easyrtc.easyApp('easyrtc.audioVideo', 'selfVideo', 
      ['callerVideo'], loginSuccess, loginFailure);

应该是:

  easyrtc.easyApp('easyrtc.audioVideo', 'selfVideo', 
      js.array(['callerVideo']), loginSuccess, loginFailure);

另见What is a difference between dart:js and js package?