![]() |
|
||||||||||
|
|||||
|
буду краток
модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
|
Отслеживай очередность загрузки и вызывай следующую после получения предыдущей.
У меня есть класс для загрузки. правда в нем еще присутствуют проверки на специальные ошибки и правомерность вызова ( возврат сервером в качестве атрибута xml done="true/false" и error="номер ошибки" /** * Класс загрузчик 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); } } } }
__________________
Отряд Котовскага Последний раз редактировалось Котяра; 15.02.2009 в 14:04. |
![]() |
Часовой пояс GMT +4, время: 21:55. |
|
|
« Предыдущая тема | Следующая тема » |
|
|