Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   LoadVars синхронная загрузка (http://www.flasher.ru/forum/showthread.php?t=168078)

Sergey_A 16.09.2011 16:44

LoadVars синхронная загрузка
 
Здравствуйте.
Проблема следующая: есть несколько текстовых файлов, переменные из которых синхронно, по setInterval, будут грузиться во флэш. Дальнейший код должен выполняться только после успешной загрузки ВСЕХ файлов. Как это лучше реализовать?
Пока идея только одна - сделать загрузку в цикле while, который просто не пустит дальше (будет бесконечно выполняться), пока не загрузится предыдущий файл. И функцию .onLoad писать для последнего в списке.
Какие еще могут быть варианты?
Заранее спасибо за любой совет.

mooncar 16.09.2011 17:36

Самый простой и очевидный способ - воспользоваться методами класса и счетчиком.
Код AS1/AS2:

var loadCount:Number = 0; //начальное состояние счетчика загрузок
var loadTotal:Number = 2; //сколько должно быть загружено всего
 
var lv1:LoadVars = new LoadVars();
var lv2:LoadVars = new LoadVars();
lv1.onLoad = lvLoad1;
lv2.onLoad = lvLoad2;
lv1.load('file1.txt');
lv2.load('file2.txt');
 
function lvLoad1(suc:Boolean)
{
        if (suc)
        {
                //действия по получению данных
 
                loadCount++; //при каждой удачной загрузке увеличиваем счетчик на 1
                if (loadCount == loadTotal) nextActions(); //и проверяем на завершенность всех загрузок
        }
}
 
function lvLoad2(suc:Boolean)
{
        if (suc)
        {
                //действия по получению данных
 
                loadCount++;
                if (loadCount == loadTotal) nextActions();
        }
}
 
function nextActions ()
{
        //дальнейшие действия
}

Ну или использовать один экземпляр LoadVars и один обработчик, если возможно.

PS. Простите, но что вы подразумеваете под "синхронно, по setInterval" ?
Синхронно - это что с чем синхронизировано? Просто загрузка файла всегда асинхронна по отношению к работе кода, для того и обработчики событий загрузки введены...

varialss 17.09.2011 12:07

Немного не в тему. Не могу создать новую ветку

Привет всем. AS2 мучаю.
Код AS1/AS2:

var vars:LoadVars = new LoadVars();
var datavar:LoadVars = new LoadVars();
vars.sendAndLoad('/test.swf'+f, datavar, "POST");
datavar.onData = function(source){
 datavar.decode(source);
//_root.s=datavar.ssylka;
//var s='ttt';
 _global.s=datavar.ssylka;
//_root.s='test';
}
trace(s);

как мне вытащить переменную s?

Зубило 18.09.2011 19:22

слушай этого чувака он дело говорит!

Sergey_A 19.09.2011 13:40

Спасибо, просто и красиво, то что надо.

Sergey_A 22.11.2011 12:57

Цитата:

Сообщение от mooncar (Сообщение 1031974)
Ну или использовать один экземпляр LoadVars и один обработчик, если возможно.

Извините, а можно про это подробнее? А то количество файлов, которые надо загрузить в один ролик, растет в геометрической прогрессии - пока было 4, еще ничего, но уже надо 16, а в перспективе - 32. Я правильно понимаю, что надо использовать что-то типа конструкции
Код AS1/AS2:

lv1.onLoad = 
lv2.onLoad = lvLoad(this._name);

Еще раз спасибо.

alexcon314 22.11.2011 13:43

Цитата:

количество файлов, которые надо загрузить в один ролик, растет в геометрической прогрессии - пока было 4, еще ничего, но уже надо 16, а в перспективе - 32
Почему сложилась такая ситуация?
Может быть, можно все переменные в одном файле хранить и грузить его единожды?

Sergey_A 22.11.2011 14:16

Вообще это данные с датчиков, информация с каждого датчика пишется в отдельный файл, и исправить ситуацию, по крайней мере, своими силами, невозможно. А на странице должны отображаться, скажем, температура на объекте, сила тока, напряжение и т. д. для установки, или даже для нескольких однотипных установок, и все это - на выбранный момент времени. А начиналось все как "простенькая флэшка типа работает аппарат - не работает". В общем - ховайся.

mooncar 22.11.2011 15:46

Вложений: 1
Ну можно вот так попробовать. Все же несколько экземпляров LoadVars, но сам обработчик один.
PS. Тестил с удаленным расположением файлов на серваке, все ок, по крайней мере с 3-мя файлами.

Код AS1/AS2:

var rlv:Array = new Array(); //массив для экземпляров LoadVars
 
var loadCount:Number ; //счетчик загрузок
var loadTotal:Number = 3; //сколько файлов должно быть загружено всего
 
for (i = 1; i <= loadTotal; i++)
{
        rlv[i] = new LoadVars();       
        rlv[i].onLoad = lvLoaded;
}
 
 
var loadData:Number = setInterval(loadTxt, 3000);
 
function loadTxt ()
{
        trace('=== ЗАПРОС ДАННЫХ ===');
        loadCount = 0; //принудительно сбрасываем счетчик
 
        for (i = 1; i <= loadTotal; i++)
        {
                trace('Загрузка ' + i + '-го файла');
                rlv[i].id = i; //запоминаем номер экземпляра LV в самом экземпляре
                rlv[i].load('file' + i +'.txt');
        }
}
 
 
function lvLoaded(suc:Boolean)
{       
        if (suc)
        {
                    trace('загрузили очередной файл...парсим данные...');
 
                loadCount++;
 
                var id:Number = this.id; //"вспоминаем", к какому экз. LV относится событие загрузки
 
                trace('Загрузка с датчика №' + id + ', переменная var1 = ' + this.var1 + ', переменная var2 = ' + this.var2);
 
                if (loadCount == loadTotal)
                {
                        nextActions();
                }
        }
}
 
function nextActions ()
{
        trace('дальнейшие действия');
        //дальнейшие действия
}


alexcon314 22.11.2011 15:50

Вот мой вариант с последовательной загрузкой:
Код AS1/AS2:

// готовимся к загрузке
var files:Array = ['filename0', 'filename1', 'filename2', 'filename3', 'filename4'];
// массив имен файлов для загрузки.
var dataArray:Array = [];
// массив для данных из файлов для дальнейшей обработки.
var fileLoader:LoadVars = new LoadVars();
//загрузчик
fileLoader.onData = FileLoaded;
//обработчик окончания загрузки очередного файла
var filesCount = 0;
// инициируем счетчик
var filesCountMax = files.length;
// общее количество файлов для загрузки
//инициируем загрузку первого файла
var fileToLoad:String = files[filesCount];
// текущий загружаемый файл
fileLoader.load(fileToLoad, fileLoader, "GET");
// понеслось
///
function FileLoaded(fileData:String) {
        if (src == undefined) {
                dataArray.push("error");
                // ошибка загрузки
                return;
        }
        dataArray.push(fileData);
        // ошибки нет, записываем полученные данные в dataArray
        if (filesCount<filesCountMax) {
                // если счетчик не дошел до макс.значения, грузим следующий файл
                fileToLoad = files[filesCount++];
                fileLoader.load(fileToLoad, fileLoader, "GET");
                return;
        }
        // загрузка всех файлов окончена,смотрим, что получилось 
        trace(dataArray);
        // а вот с этой строки надо делать переход в код, где обрабатываются данные загруженных файлов из dataArray.
        // например
        ActionForData(dataArray);
}
function ActionForData(dataArray:Array) {
        // TODO
}



Часовой пояс GMT +4, время: 19:04.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.