PDA

Просмотр полной версии : Как передать массив из вложенной функции?


dmk777
02.08.2009, 18:21
Привет!

Нужно передать данные из функции в массив. Помогите разобраться.
Сильно не мните, в ActionScript всего неделю :)
Переменные s1,s2,s3 не присваиваются значения. Подскажите как лучше сделать.
Пожалуйста для ActionScript 2.0.

Вот код:
function ReadPHP(news_number):Array {
// Загружаем данные из PHP
var sv:LoadVars = new LoadVars();
var rv:LoadVars = new LoadVars();
var s1:String = "";
var s2:String = "";
var s3:String = "";

rv.onLoad = dataLoad;
sv.sendAndLoad("http://www.eg.ru/read_top5.php?number=" + news_number, rv, "POST");
//trace("read_top5.php?number=" + news_number);
function dataLoad(done:Boolean) {
if (done) {
//trace(rv.my_title);
//trace(rv.short_story);

s1 = rv.my_title;//Header
s2 = rv.short_story;//Short story
s3 = rv.category;//Category
Trace(s1);
Trace(s2);
Trace(s3);
}
};
var ar:Array = new Array();
ar.push(s1);//Header
ar.push(s2);//Short story
ar.push(s3);//Category
Trace("Внешние переменные: " + ar);
return ar;
};//ReadPHP

//Загружаем новости
//MyArr = new Array(3);

var Arr:Array = new Array();
Arr = ReadPHP(0);
news_header_01 = Arr[0];
news_short_story_01 = Arr[1];
news_category_01 = Arr[2];

Добавлено через 1 минуту
PHP обрабатывает все нормально. Данные проходят.

mooncar
02.08.2009, 18:36
Заполнение массива и его возврат поставьте внутрь функции dataLoad, иначе элементы массива останутся неопределенными. (Код AS работает асинхронно, у вас к моменту заполнения массива переменные s1 и прочие еще не определены). И массив объявите пораньше, например, в начале функции.

Добавлено через 11 минут
function ReadPHP(news_number):Array {
// Загружаем данные из PHP
var sv:LoadVars = new LoadVars();
var rv:LoadVars = new LoadVars();
s1 = "";
s2 = "";
s3 = "";
ar = new Array();

rv.onLoad = dataLoad;
sv.sendAndLoad('http://www.eg.ru/read_top5.php?number=' + news_number, rv, 'POST');
//trace('read_top5.php?number=' + news_number);
function dataLoad(done:Boolean) {
if (done) {
//trace(rv.my_title);
//trace(rv.short_story);

s1 = rv.my_title;//Header
s2 = rv.short_story;//Short story
s3 = rv.category;//Category
ar.push(s1);//Header
ar.push(s2);//Short story
ar.push(s3);//Category
return ar;
}
}


}//ReadPHP

//Загружаем новости
//MyArr = new Array(3);

var Arr:Array = new Array();
Arr = ReadPHP(0);
news_header_01 = Arr[0];
news_short_story_01 = Arr[1];
news_category_01 = Arr[2];

Если что, то имейте ввиду - переменные, объявленные внутри функции с использованием var, видны только в ней и умирают после ее отработки.
Добавлено через 28 минут
И если уж по мелочам, то точки с запятыми в конце функций не нужны, так они объявляются явно, и не анонимные, через ссылку, как тут:
rv.onLoad = dataLoad;

dmk777
02.08.2009, 19:07
Внутри функции dataLoad все видно, только после выхода из нее в массиве AR все значения undefined

Добавлено через 4 минуты
>И если уж по мелочам, то точки с запятыми в конце функций не нужны
Сорри, привычка из Pascal

mooncar
02.08.2009, 19:14
Поставьте внутрь блока с if (done) {
s1 = rv.my_title;//Header
s2 = rv.short_story;//Short story
s3 = rv.category;//Category
ar:Array = new Array();
ar.push(s1);//Header
ar.push(s2);//Short story
ar.push(s3);//Category
return ar;

dmk777
02.08.2009, 19:22
Не работает. Видно только внутри функции dataLoad. При выходе опять undefined

mooncar
02.08.2009, 19:23
Сорри, привычка из Pascal
Это ерунда, главное массив заполняйте внутри dataLoad... а вот как с возвратом быть.. тут я поторопился.

dmk777
03.08.2009, 13:04
Интересная вложенная функция. Даже глобальные переменные после выхода из нее становятся неопределенными. Почти целая ночь гугления ничего не дала. Встречал слабопохожие варианты, но там говорили табу.
В общем сделал внутри нее вызов в 3-ю функцию и тогда все заработало. Спасибо за участие :-)

mooncar
03.08.2009, 17:44
Хорошо.Конечно же, можно было бы и по другому организовать, но на самом деле задачка, как мне кажется, имеет решение. Эх опыт, сын ошибок трудных...