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

基本的に、私がやろうとしているのは、クライアントが接続するとすぐに socket.io を使用して送信されるサーバー生成 ID を使用して、新しい PeerJS ピアを作成することです。そのため、 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(あなたの例がリスナーをアタッチする場所) はそこにある必要はありません。barあなたの例から何が必要かは明らかではありませんがpeer、オブジェクトを複数のコントローラーと共有する必要がある場合は、各コントローラーに挿入されるサービスでオブジェクトをラップする必要があります。

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()が存在する前の呼び出しpeer(つまり、延期される) と、コントローラーが呼び出しの後にインスタンス化される場合peer(つまり、ピアですぐに呼び出される) を処理します。

于 2015-02-05T23:46:15.777 に答える