2012-06-20 23 views
7

Tôi có một thực thi JavaScript Websockets nơi tôi muốn sử dụng một mô hình singleton sử dụng một kết nối Websocket cho nhiều cuộc gọi tới máy chủ nhưng với các trình xử lý sự kiện gọi lại khác nhau. Tôi đã thực hiện làm việc tốt nhưng đã nhận thấy một số hành vi lạ với các tin nhắn được chuyển đến trình xử lý gọi lại sai. Dưới đây là một số mã:Đối tượng Singleton Websockets với các trình xử lý gọi lại khác nhau

Connection.js nộp nộp

var App = function(){ 
    return { 
     cpuUtilization : function(evt){ 
      var localSocket = this; 
      var dateTimeOfRequest = localSocket.extraParameter; 
      var originalDataSent = localSocket.originalDataSent 
      var jsonData = $.parseJSON(evt.data); 
      if ($.parseJSON(originalDataSent).type == "cpu"){ 
       $("#dateTimeContainer").html(); 
       $("#cpuContainer").html(jsonData.value); 
      } 
     } 
    } 
}(); 

Bên Thứ Ba Signal.js nộp

var connection = function(){ 
    var _socket = null; 
    return { 
     socket : function(){ 
      if (_socket == null){ 
       _socket = new WebSocket("ws://localhost:8081/index.ashx"); 
       _socket.onclose = function(evt){alert('Closed');} 
       _socket.extraParameter = null; 
      } 
      return _socket; 
     }, 
     send : function(data, callback){ 
      var localSocket = connection.socket(); 
      localSocket.extraParameter = new Date().toString(); 
      localSocket.onmessage = callback; 
      localSocket.originalDataSent = data; 
      localSocket.send(data); 
     } 
    } 
}(); 

App.js

var Signal = function(){ 
    return { 
     handlerProcess : function(evt){ 
      // Does some third party stuff... 
     } 
    } 
}(); 

sử dụng

connection.send("{type:'process'}", Signal.handlerProcess); 
connection.send("{type:'cpu'}", App.cpuUtilization); 
connection.send("{type:'memory'}", Signal.handlerMemory); 
connection.send("{type:'harddrive'}", Signal.handlerHardDrive); 

Bây giờ tôi nghĩ rằng tôi thấy vấn đề là khi nhiều yêu cầu được thực hiện thông qua cùng một websocket và thông báo trả về. Vì đây là không đồng bộ, tôi không có cách nào để buộc yêu cầu gọi lại sự kiện. Giải pháp của tôi sử dụng các tùy chọn trong trình xử lý để tham khảo, nhưng tùy thuộc vào thời gian cần để yêu cầu websocket chạy, trình xử lý gọi lại sai đang được gọi và xử lý không thành công. Tôi nghĩ rằng nó không thành công vì tôi đang truy cập các thuộc tính từ cá thể websocket có thể thay đổi giữa các cuộc gọi.

Có cách nào để chuyển tham chiếu hoặc tham số bổ sung cùng với thông số evt không? Có lẽ gói này bằng cách nào đó?

Trả lời

7

Tôi nghĩ rằng nó không thành công vì tôi đang truy cập các thuộc tính từ cá thể websocket có thể thay đổi giữa các cuộc gọi.

Có.

Vì đây là không đồng bộ, tôi không có cách nào để buộc yêu cầu gọi lại sự kiện.

số Bạn có thể tạo ra một kết thúc cho hàm callback thay vì gọi bằng callback trực tiếp:

... send: function(data, callback){ 
    var localSocket = connection.socket(); 
    var extraParameter = new Date().toString(); 
    localSocket.onmessage = function(evt) { 
     callback(evt.data, /* original- */ data, extraParameter); 
    }; 
    localSocket.send(data); 
} 

Nhưng vẫn còn, bạn có một thay đổi handler onmessage gọi lại. Điều đó có nghĩa, một sự kiện có thể được gửi đến một người xử lý không xứng đáng với nó. Có một hệ thống không đồng bộ, bạn sẽ cần phải thêm một phần thông tin vào máy chủ phản hồi cho biết quá trình dữ liệu thuộc về. Một trình xử lý tin nhắn phổ quát sau đó có thể giải quyết điều đó và gọi lại callback đúng.

+0

Cảm ơn bạn. Tôi chỉ giả định đây là trường hợp. Tôi sẽ phải đưa ra một quy trình khác. Tôi nghĩ rằng việc thêm một số thông tin vào phản hồi của máy chủ có thể thực hiện công việc với một số thay đổi nhỏ trên mã máy khách. Tôi chỉ muốn có các thuộc tính bổ sung cho sự kiện onmessage mà tôi có thể sử dụng để lưu trữ một số dữ liệu tạm thời. Cám ơn một lần nữa và chúc một ngày tốt lành – WalkSolutions

Các vấn đề liên quan