hoe clone je een multi-meg diep object? (moet asycnhroon denk ik)

Status
Niet open voor verdere reacties.

rajmv

Gebruiker
Lid geworden
13 jul 2011
Berichten
112
Voor een van m'n nieuwe componenten, m'n serviceLog, moet ik een heel groot object (ongeveer 2Mb op het moment, maar kan ook groter worden) clonen.

De standaard recursieve clone scripts werken niet meer omdat ze de browser bevriezen.

Ik heb iets asynchroons nodig, maar ik krijg het niet goed aan het werk..

Hebben jullie mischien ideeen?

Code:
rajmv.cloneObjectAsync({
	original : errors[host][lbl],
	origin : { errorsID : errorsID, errorsDivID : errorsDivID, host : host,  lbl : lbl },
	statusCallback : rajmv.graphs.raphael.cloneObjectAsync_statusCallback,
	resultCallback : rajmv.graphs.raphael.cloneObjectAsync_resultCallback 
});

Code:
	cloneObjectAsync : function (cmd) {
		var rscc = rajmv.settings.cloneObjectAsync.commands;
		var cmdIdx = rscc.length;
		rscc[cmdIdx] = cmd;
		cmd.result = {};
		cmd.pr = cmd.result;
		cmd.level = 0;
		if (!cmd.po) /*pointer original*/ cmd.po = cmd.original;
		if (!cmd.countKeys) cmd.countKeys=1;
		rajmv.cloneObjectAsync_do (cmd, cmd.po, cmd.pr, cmd.level);
	},
	
	cloneObjectAsync_do : function (cmd, oldPO, oldPR, oldLevel) {
		if (cmd.countKeys/193===Math.round(cmd.countKeys/193)) {
			setTimeout (function () {
				cmd.countKeys++;
				rajmv.cloneObjectAsync_do(cmd,oldPO,oldPR,oldLevel); // prevents CPU rapes and crashes when copying multi-meg objects
			}, 400); 
		} else {
			for (var k in cmd.po) {
				cmd.countKeys++;
				if (typeof cmd.po[k]=='object' && cmd.po[k] !== null) {
					var oPO = cmd.po;
					var oPR = cmd.pr;
					var oLevel = cmd.level;
					cmd.po = cmd.po[k];
					cmd.pr[k] = (cmd.po[k] instanceof Array) ? [] : {};
					cmd.pr = cmd.pr[k];
					cmd.level++;
					rajmv.cloneObjectAsync_do (cmd, oPO, oPR, oLevel);
				} else {
					cmd.pr[k] = cmd.po[k];
				}
			}
		};
			cmd.po = oldPO;
			cmd.pr = oldPR;
			cmd.level = oldLevel;
			
		if (cmd.level==0) cmd.resultCallback (cmd);
	},
 
Laatst bewerkt:
Ik heb op het web iets beters gevonden dat ik aangepast heb, dit werkt;

Code:
	cloneObjectAsync : function (cmd) {
		var rscc = rajmv.settings.cloneObjectAsync.commands;
		var cmdIdx = rscc.length;
		rscc[cmdIdx] = cmd;
		cmd.result = {};
		cmd.lastPause = 0;
		cmd.lastCheck = 0;
		cmd.countKeys=1;
	    var queue = [{parent:null,source:cmd.original,target:cmd.result}];
	
	    var processQueue = function() {
			if (queue.length==0) {
			debugger;
				cmd.resultCallback(cmd);
			} else {
	        	var it = queue.shift();
		        for (var k in it.source) {
					cmd.countKeys++;
					$('#rslv_status2').html (cmd.countKeys + ' - ' + queue.length);
					if (typeof it.source[k]=='object' && it.source[k]!==null && it.source[k]!=undefined) {
						 it.target[k] = (it.source[k] instanceof Array) ? [] : {};
						queue.push({parent:it.source, source:it.source[k], target:it.target[k]});
					} else {
						it.target[k] = it.source[k];
					};
		        }
				$('#rslv_status2').html (cmd.countKeys + ' - ' + queue.length);
				var pauseFactor = cmd.countKeys/1123   ;
				if (pauseFactor > cmd.lastPause+1) {
					setTimeout (function () {
						cmd.lastPause = pauseFactor;
						cmd.countKeys++;
			            processQueue();
					}, 50);
				} else {
					processQueue();
				};
				
				
			}
	    }
	    processQueue();
	},
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan