我正在使用Node Socket.io
将数据从服务器推送到客户端浏览器.在客户端我使用jQuery填充DOM中返回的行.
我在代码片段下面用来填充Socket.io返回的数据.
var OverSpeedAlerts = []; var TripCancellation = []; var GeofenceInOutAlerts = []; var ScheduleOverstay = []; var UnSchduledOverstay = []; var SkippedBusStop = []; var TripDelayAlert = []; var SkippedUnplannedAlert = []; var DelayStartEndAlert = []; var RouteDeviatedAlert = []; var MultipleBusEntry = [];
声明原型:
Array.prototype.inArray = function (comparer) { for (var i = 0; i < this.length; i++) { if (comparer(this[i])) return true; } return false; }; // adds an element to the array if it does not already exist using a comparer // function Array.prototype.pushIfNotExist = function (element, comparer) { if (!this.inArray(comparer)) { this.unshift(element); } };
处理从套接字收到的数据:
if (typeof io !== 'undefined') { var pushServer = io.connect('http://SomeIP:3000'); pushServer.on('entrance', function (data) { var rows = data.message; var NumberOfRows = rows.length; $('#notifications').html(NumberOfRows); // console.log(rows); OverSpeedAlerts = []; TripCancellation = []; GeofenceInOutAlerts = []; ScheduleOverstay = []; UnSchduledOverstay = []; SkippedBusStop = []; TripDelayAlert = []; SkippedUnplannedAlert = []; DelayStartEndAlert = []; RouteDeviatedAlert = []; var MultipleBusEntry = []; for (var i = 0; i < rows.length; i++) { if (rows[i].alert_type == 'overspeed') { OverSpeedAlerts.pushIfNotExist(rows[i], function (e) { return e.device_id === rows[i].device_id && e.alert_gen_date_time === rows[i].alert_gen_date_time; }); } else if (rows[i].alert_type == 'trip_cancellation') { TripCancellation.pushIfNotExist(rows[i], function (e) { return e.device_id === rows[i].device_id && e.alert_gen_date_time === rows[i].alert_gen_date_time; }); } else if (rows[i].alert_type == 'Geofence-In' || rows[i].alert_type === 'Geofence-Out') { GeofenceInOutAlerts.pushIfNotExist(rows[i], function (e) { return e.device_id === rows[i].device_id && e.alert_gen_date_time === rows[i].alert_gen_date_time; }); } else if (rows[i].alert_type == 'Scheduled-Overstay') { ScheduleOverstay.pushIfNotExist(rows[i], function (e) { return e.device_id === rows[i].device_id && e.alert_gen_date_time === rows[i].alert_gen_date_time; }); } else if (rows[i].alert_type == 'Unscheduled-Overstay') { UnSchduledOverstay.pushIfNotExist(rows[i], function (e) { return e.device_id === rows[i].device_id && e.alert_gen_date_time === rows[i].alert_gen_date_time; }); } else if (rows[i].alert_type == 'Skipped Unplanned' || rows[i].alert_type == 'Skipped-Busstop') { SkippedBusStop.pushIfNotExist(rows[i], function (e) { return e.device_id === rows[i].device_id && e.alert_gen_date_time === rows[i].alert_gen_date_time; }); } else if (rows[i].alert_type == 'Delay Start' || rows[i].alert_type == 'Delay End') { TripDelayAlert.pushIfNotExist(rows[i], function (e) { return e.device_id === rows[i].device_id && e.alert_gen_date_time === rows[i].alert_gen_date_time; }); } else if (rows[i].alert_type == 'Route Deviated') { RouteDeviatedAlert.pushIfNotExist(rows[i], function (e) { return e.device_id === rows[i].device_id && e.alert_gen_date_time === rows[i].alert_gen_date_time; }); } else if (rows[i].alert_type == 'Multiple Bus Entry') { MultipleBusEntry.pushIfNotExist(rows[i], function (e) { return e.device_id === rows[i].device_id && e.alert_gen_date_time === rows[i].alert_gen_date_time; }); } } CreateOverSpeedGrid(); CreateTripCancellation(); CreateGeofenceGrid(); CreateScheduleOverstayGrid(); CreateUnSchduledOverstayGrid(); CreateTripDelayGrid(); CreateSkippedBusStop(); CreateRouteDeviationAlert(); CreateMultipleBusEntry(); }); pushServer.on('end', function (socket) { }); }
上述功能之一如下.Rest是在DOM的其他部分填充数据的类似功能.
function CreateOverSpeedGrid() { $('#tabs ul').find('a:contains("Overspeed Alerts")').html('OverSpeed Alerts(' + OverSpeedAlerts.length + ')'); if (OverSpeedAlerts.length != 0) { $('#notifyOverspeed table').html(''); $('#notifyOverspeed table').append(''); //new Date([UNIX Timestamp] * 1000); for (var i = 0; i < OverSpeedAlerts.length; i++) { $('#notifyOverspeed table').append(' Depot Route Schedule Trip Number Trip Direction Alert Summary Alert Details Generated On '); } } } ' + OverSpeedAlerts[i].depot_name + ' ' + OverSpeedAlerts[i].route_name + ' ' + OverSpeedAlerts[i].schedule_no + ' ' + OverSpeedAlerts[i].trip_number + ' ' + OverSpeedAlerts[i].trip_direction + ' ' + OverSpeedAlerts[i].alert_sub + ' ' + "Place mouse pointer to view message" + ' ' + new Date(OverSpeedAlerts[i].alert_gen_date_time * 1000) + '
上面的代码工作正常.问题是,由于从套接字每隔10秒收到如此多的推送消息,浏览器无法处理如此多的数据并挂起.
有没有更好的方法呢?