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 đó?
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