Отслеживай очередность загрузки и вызывай следующую после получения предыдущей.
У меня есть класс для загрузки. правда в нем еще присутствуют проверки на специальные ошибки и правомерность вызова ( возврат сервером в качестве атрибута 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);