1

我有以下代码片段

var peer = {};

var foo = function ($scope, socket) { // socket is a factory to wrap socket.io in angular
    socket.on('setUID', function (data) {
        peer = new Peer(data);
    });
};

var bar = function ($scope, socket) {
    peer.on('connect', function () { alert("blah"); }); // this line doesn't work
}

// foo and bar are both controllers in angular, which are attached to separate areas in the application

本质上,我要做的是使用服务器生成的 ID 创建一个新的 PeerJS 对等体,一旦客户端连接,该 ID 就会使用 socket.io 传输。因此,我知道将在触发 on 侦听器之前创建对等对象。但是,我不认为 javascript 知道这一点。如何设置它以便我可以在我的控制器中使用对等方的未来功能?

编辑:这是我目前拥有的

app.factory('peer', function ($rootScope, socket) {
    var peer = {};

    socket.on('setUID', function (data) {
        peer = new Peer(data, {host: 'localhost', port: 9000, path: "/peer/"});
        console.log("Peer created");
        peer.on('open', function (id) { // these work fine
            console.log('My peer ID is: ' + id);
        });

        peer.on('connection', function (conn) {
            conn.on('open', function () {
                conn.on('data', function (data) {
                    console.log("Received: " + data);
                });
            });
        });
    });

    return {
        getPeer: function () {
            return peer;
        }
    };
});


var bar = function ($scope, socket, peer) {
    var p = peer.getPeer();
    p.on("connection", console.log("hello")); // works once, then says p.on is not a function
}
4

1 回答 1

0

您应该在Peer创建后附加事件侦听器,如下所示:

var peer = {};

var foo = function ($scope, socket) { // socket is a factory to wrap socket.io in angular
    socket.on('setUID', function (data) {
        peer = new Peer(data);
        peer.on("connect", function () { alert("Hi!"); });
    });
};

peer您(您的示例附加侦听器的位置)中的对象bar不需要在那里,并且正如您发现的那样,它不会像这样工作。从您的示例中不清楚有什么需求barpeer但是如果您需要与多个控制器共享一个对象,您应该将该对象包装在注入每个控制器的服务中:

var PeerService = function ($q, socket) {
  var defered = $q.defer();
  var peer;

  socket.on("setUID", function (data) {
    peer = new Peer(data);
    deferred.resolve(p);
  });

  return {
    connected: function (callback) {
      $q.success(function () {
        callback(peer);
      });
    }
  }
};

var bar = function ($scope, PeerService) {
  $scope.data = [];

  PeerService.connected(function (peer) {
    peer.on("data", function (data) {
      $scope.data.push(data);
    })
  });
}

这将接受回调,并且在它可以提供对象PeerService之前不会调用回调。peer此模式处理PeerService.connected()在存在 a 之前的控制器调用peer(即它被延迟)以及控制器在之后实例化的情况peer(即它立即与对等方调用)

于 2015-02-05T23:46:15.777 回答