Форум 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)
-   -   Как передать массив из вложенной функции? (http://www.flasher.ru/forum/showthread.php?t=128223)

dmk777 02.08.2009 18:21

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

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

Вот код:
Код AS1/AS2:

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 минут
Код AS1/AS2:

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 минут
И если уж по мелочам, то точки с запятыми в конце функций не нужны, так они объявляются явно, и не анонимные, через ссылку, как тут:
Код AS1/AS2:

rv.onLoad = dataLoad;


dmk777 02.08.2009 19:07

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

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

mooncar 02.08.2009 19:14

Поставьте внутрь блока с if (done) {
Код AS1/AS2:

  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

Цитата:

Сообщение от dmk777 (Сообщение 839986)
Сорри, привычка из Pascal

Это ерунда, главное массив заполняйте внутри dataLoad... а вот как с возвратом быть.. тут я поторопился.

dmk777 03.08.2009 13:04

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

mooncar 03.08.2009 17:44

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


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

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