2015-02-05 41 views
1

我有下面的代码片段使用你知道一个对象的功能将在Javascript中创建和角度(特色Peerjs和Socket.io)

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 

从本质上讲,我试图做的是创建一个新的PeerJS对等体使用服务器生成的ID,一旦客户端连接,它就使用socket.io传输。因此,我知道在监听器被触发之前会创建对等对象。但是,我不认为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 
} 
+0

仍然有与' peer.getPeer()'它可能会也可能不会返回一个实例化的'Peer',这取决于socket.on(“setUID”,...)是什么时候发生的 – craigb 2015-02-06 01:26:02

回答

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对象。这种模式处理控制器在peer(即它被延迟)之前调用PeerService.connected(),以及在peer(即立即与对等方调用)之后实例化控制器的情况

+0

对不起,我应该提到foo是一个控制器部分,而酒吧是另一个控制器。我将编辑原始问题以反映这一点。 除此之外,如果我使用建议的PeerService思想,我假设我将能够使用参数创建对等对象,并从另一个控制器访问它以及它的功能,对吗? – ragesalmon 2015-02-05 23:48:50

+0

是的,这个例子并不清楚“bar”和“peer”这个角色的作用(因为我们想简化我们的例子),但是关于包装在服务中的评论也适用。你仍然必须管理这样一个事实,即你的控制器等在“Peer”已经实例化之前或者可能在实例化之后发挥作用,并且服务是以这种方式来处理的。 – craigb 2015-02-05 23:52:56

+0

对不起三重文章,但我想最后,事件听众的位置并不重要,是吗?在这种情况下,我可以将它们放入服务中,对吗? – ragesalmon 2015-02-06 00:46:06

相关问题