Показать сообщение отдельно
Старый 15.02.2009, 14:01
Котяра вне форума Посмотреть профиль Отправить личное сообщение для Котяра Посетить домашнюю страницу Котяра Найти все сообщения от Котяра
  № 3  
Ответить с цитированием
Котяра
буду краток
 
Аватар для Котяра

модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
Отправить сообщение для Котяра с помощью ICQ Отправить сообщение для Котяра с помощью Skype™
Отслеживай очередность загрузки и вызывай следующую после получения предыдущей.
У меня есть класс для загрузки. правда в нем еще присутствуют проверки на специальные ошибки и правомерность вызова ( возврат сервером в качестве атрибута xml done="true/false" и error="номер ошибки"
Код AS1/AS2:
/**
* Класс загрузчик XML -
* позволяет ставить загрузки в очередь и назначать обработчики событий загрузки
* @author k0t0vich (c) 2008
*/
 
//import mx.data.encoders.Num;
import mx.utils.Delegate;
 
class XMLLoader extends Object
{
	// Флаг имеется ли соединение к сокет серверу
	private var _isSocketConnected:Boolean;
	// максимальное число повторных вызовов при обрыве связи
 
	public var maxCallingCount:Number = 5;
	private var _log:String = '';
 
 
	// Флаг загрузился ли предыдущий вызов
	private var prevLoaded:Boolean = true;
 
	// очередь вызовов
	private var dataStack:Array;
 
 
 
	//текущий объект вызова
	private var dataObject:Object;
	//текущий объект Асинхронного вызова
	//private var dataAsincObject:Object;
 
	//var socket:XMLSocket;
	var socket:Object;
 
	public function get isSocketConnected():Boolean
	{
		return _isSocketConnected;
	}
 
 
	public function get log():String
	{
		return _log;
	}	
 
	// конструктор
	public function XMLLoader() 
	{
 
		trace ("XMLLoader: constructor+++");
		dataStack = new Array();
		dataStack = [];
		dataObject = new Object();
 
 
	}
 
 
	// ТаймСтамп
	public function timeStamp():Number
	{
	var today:Date = new Date();
	return today.valueOf();
	}
 
	// Очистить лог
	public function clearLog()
	{
	allSize = 0;
	_log = '';
	}
 
	var allSize:Number = 0;
	private function addToLog(data:Object)
	{	
	data.onLoadTime = timeStamp();
	var tmp_log:String; 
	var byteSize = data._xml.getBytesTotal();
	allSize += byteSize;
	tmp_log= "----------------"+allSize+"-----------------------------------------------\r"
	if(data.asinc== true)tmp_log += "Асинхронный вызов\r";
	tmp_log += 'URL:' + data.url+"\r";
	tmp_log += 'Поставлен в очередь:' + data.startTime+"\r";
	tmp_log += 'Ожидание в очереди, мс:' + (data.loadTime-data.startTime)+"\r";
	tmp_log += 'Время загрузки, мс:' + (data.onLoadTime-data.loadTime)+"\r";
	tmp_log += 'Размер, байт:' +byteSize +"\r";
	tmp_log += 'Количество вызовов:' + data.counter+"\r\r";
	tmp_log += 'XML:\r' + data._xml+"\r";
 
		if (data._xml.firstChild.attributes.error!=undefined)
		{
			tmp_log += "Ошибка: "+_root.lang_atr["errmsg"+data._xml.firstChild.attributes.error]+'\r';
		}
	trace(tmp_log);
	_log = tmp_log +_log;	
	}
 
 
	// Функция помещения скрипта в очередь 
	// url:String - адрес
	//	onLoadFunction - функция для обработки полученной XML( в качестве аргумента должен быть тип XML)
	// 	http:Boolean  - вызов строго через http запрос, по умолчанию false - вызов по сокет соединению
	public function load(url:String,onLoadFunction:Function, http:Boolean,local:Boolean) :Boolean
	{	
		//loadAsinc(url, onLoadFunction);
		//return true;
 
		trace ("XMLLoader: load"+url);
		// вызов строго через htpp запрос по умолчанию  
		//TODO: сделать false 
		http = (http == undefined)?true:http;
 
		local = (local == undefined)?false:local;
 
		// установка значений объекта вызова
		var dataObject:Object = new Object();
			dataObject.url = url;
			dataObject.local = local;
			dataObject.onLoadFunction = onLoadFunction;
			dataObject.http = http;
			dataObject.startTime = timeStamp();
 
		// если пустая очередь - добавить вызов в очередь и запустить 
		if (dataStack.length == 0 && prevLoaded)
		{
			dataStack.push(dataObject);
			loadNextData();
		}
		// иначе только добавить в очередь
		else 
		{
			dataStack.push(dataObject);	
		}
 
		return true;
 
	}
	// загрузить следующий по очереди 
 
	var my_timedProcess:Number;
 
	private function loadNextData():Boolean
	{
		if (dataStack.length == 0 )
		{
			return false;
		}
		else if (prevLoaded)
		{
			prevLoaded = false;
			//основной вызов
			dataObject = new Object();
			dataObject = dataStack.shift();
			// счетчик вызовов при обрыве связи
			dataObject.counter = 0;
 
			if (_isSocketConnected && !dataObject.http)
			{
				//TODO: socket
			}
			else
			{
				// запрос XML по http	
				loadDataObjectXML();
 
			}
 
		}
		return true;
	}
 
 
	private function loadDataObjectXML()
	{			
				dataObject.counter++;
				dataObject._xml = new XML();
				dataObject._xml.ignoreWhite = true;
				dataObject.loadTime = timeStamp();
				if (!dataObject.local)
				dataObject.url += "&uncash" + timeStamp();
				dataObject._xml.load(dataObject.url);
				dataObject._xml.onLoad = Delegate.create(this, onLoadXML);
	}
 
	function get_unchase_data()
	{
		return getTimer();
	}
 
 
	private function onLoadXML(success)
	{		
		if (success)
		{						
						if (dataObject._xml.firstChild.attributes.done == "true") 
						{
						// вызов функции обработчика
						addToLog(dataObject);
						dataObject.onLoadFunction(dataObject._xml);
						// вызов следующего в очереди	
						prevLoaded = true;
						loadNextData();
						}
						else 
						{
							// обработчик стандартных ошибок.
							addToLog(dataObject, true);
							_root.dealWithErr(dataObject._xml);
							prevLoaded = true;
							loadNextData();
						}
		}
		else 
		{ // обработчик ошибок - соединение не установлено
			// повторная загрузка XML
			if (dataObject.counter < maxCallingCount)
			{
			loadDataObjectXML();
			}
			else 
			{
				// ошибка - соединение не установлено
				dataObject._xml = new XML("<data error='101'/>");
				addToLog(dataObject);
				_root.dealWithErr(dataObject._xml);
				prevLoaded = true;
				loadNextData();
			}
		}
 
	}
 
	// Функция Ассинхронного вызова 
	// url:String - адрес
	//	onLoadFunction - функция для обработки полученной XML( в качестве аргумента должен быть тип XML)
	// 	http:Boolean  - вызов строго через http запрос, по умолчанию false - вызов по сокет соединению
	public function loadAsinc(url:String,onLoadFunction:Function, http:Boolean,local:Boolean) 
	{
		// вызов строго через htpp запрос по умолчанию  
		//TODO: сделать false 
		http = (http == undefined)?true:http;
 
		local = (local == undefined)?false:local;
 
		// установка значений объекта асинхронного вызова
		var dataAsincObject= new Object();
		dataAsincObject.url = url;
		dataAsincObject.onLoadFunction = onLoadFunction;
		dataAsincObject.http = http;
		dataAsincObject.local = local;
		dataAsincObject.startTime = timeStamp();
		dataAsincObject.counter = 0;
		dataAsincObject.asinc= true;
 
		loadDataAsincObjectXML(dataAsincObject);
 
	}
 
 
	private function loadDataAsincObjectXML(dataAsincObject)
	{			dataAsincObject.counter++;
				dataAsincObject._xml = new XML();
				dataAsincObject._xml.ignoreWhite = true;
				dataAsincObject.loadTime = timeStamp();
				if (!dataAsincObject.local)
				dataAsincObject.url += "&uncashing" + timeStamp();
				dataAsincObject._xml.load(dataAsincObject.url);
				dataAsincObject._xml.onLoad = Delegate.create(this, function(success) {onLoadAsincXML(dataAsincObject,success)});
	}
 
 
 
	private function onLoadAsincXML(dataAsincObject,success)
	{		
		if (success)
		{						
						if (dataAsincObject._xml.firstChild.attributes.done == "true") 
						{
						// вызов функции обработчика
						addToLog(dataAsincObject);
						dataAsincObject.onLoadFunction(dataAsincObject._xml);
						}
						else 
						{
							// обработчик стандартных ошибок.
							addToLog(dataAsincObject);
							_root.dealWithErr(dataAsincObject._xml);
 
						}
		}
		else 
		{ 
			// обработчик ошибок - соединение не установлено
			// повторная загрузка XML
			if (dataAsincObject.counter < maxCallingCount)
			{
			dataAsincObject.counter++;
			loadDataAsincObjectXML(dataAsincObject);
			}
			else 
			{
				// ошибка - соединение не установлено
				dataAsincObject._xml = new XML("<data error='101'/>");
				addToLog(dataAsincObject);
				_root.dealWithErr(dataAsincObject._xml);
			}
		}
 
	}
 
}
Т.е. класс используется так:
Код AS1/AS2:
xmlLoader = newXMLLoader();
xmlLoader.load(url,funk1);
__________________
Отряд Котовскага


Последний раз редактировалось Котяра; 15.02.2009 в 14:04.