Форум 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)
-   -   вопрос по XML(function return) (http://www.flasher.ru/forum/showthread.php?t=111112)

MrXoT 16.04.2008 11:59

вопрос по XML(function return)
 
у меня такая проблема я не могу сделать вывод функции onLoad
вот код

Код:

function pars(){
  var arr=new Array();

  var xml:XML = new XML();
  xml.ignoreWhite = true;

  xml.onLoad = function(success:Boolean){
      if(success){
          for(var i=0; i<xml.childNodes.length; i++){
            var node_info=xml.childNodes[i].firstChild;
            arr[i]=node_info;
          }
      }
  }

  xml.load("xml.xml");
  return arr;
}


var a = pars();
trace(a) //и выводит пустой массив, что я не так делаю?


alekslitvinenk 16.04.2008 12:18

Надо вот так:

Код:


var node_info=xml.firstChild.childNodes[i];


iNils 16.04.2008 12:25

Код:

var arr:Array = new Array ();
var xml:XML = new XML ();
xml.ignoreWhite = true;
xml.onLoad = function (success:Boolean) {
        if (success) {
                for (var i = 0; i < this.childNodes.length; i++) {
                        var node_info = this.childNodes[i].firstChild;
                        arr[i] = node_info;
                }
                trace (arr);
        }
};
xml.load ("xml.xml");


qazwsx 16.04.2008 12:32

xml.onLoad это ивент т.е кагда у xml лсучается onLoad выполняется далее описанная функция. Вы же пытаетесь из совершенно другой функции вернуть параметр этой :).

MrXoT 16.04.2008 12:33

alekslitvinenk
я знаю как надо
XML структура у меня такая <node></node>

iNils
да я так пробывал но как вывести массив через return?

qazwsx
ну вот как из этого ивента сделать вывод массива ? :)

qazwsx 16.04.2008 12:40

Так как написал inils только вместо трейс ретурн.

iNils 16.04.2008 12:49

Забудьте про return, он вам в данном случаи не поможет.

MrXoT 16.04.2008 12:52

какие тогда могут быть идеи...
просто нужна функция которая бы выводила массив с информацией из XMLа

Nik_M 16.04.2008 12:53

Я вот тоже задавался этим вопросом и тоже не мог вывести массив за пределами функции, выводился пустой. Все сделал как написал iNils и все равно не работает, внутри функции массив заполняется, а вот после уже пустой:(

iNils 16.04.2008 12:55

Она у вас есть, называется xml.onLoad
Как только вы начали подгружать внешние данные, можете забыть про линейность выполнения кода, все действеия теперь фнутри методов и событий.

Кстати, на этом форуме наказывают за глобальное игнорирование запятых.

Цитата:

Сообщение от Nik_M
все равно не работает, внутри функции массив заполняется, а вот после уже пустой:(

Все наоборот. Вы путаете последовательность действий.
Если написать такой код
Код:

var arr:Array = new Array ();
var xml:XML = new XML ();
xml.ignoreWhite = true;
xml.onLoad = function (success:Boolean) {
        if (success) {
                for (var i = 0; i < this.childNodes.length; i++) {
                        var node_info = this.childNodes[i].firstChild;
                        arr[i] = node_info;
                }
                trace ("B:" + arr);
        }
};
xml.load ("xml.xml");
trace ("A:" + arr)

То "A:" выведется сразу, а "B:" может появиться, через секунду, минуту, миллисекунду, но всегда после "A:", так как на загрузку, даже с локального диска, нужно время.

Nik_M 16.04.2008 13:32

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

iNils 16.04.2008 13:39

Цитата:

Сообщение от Nik_M
А мне то нужно чтобы "A" выводило содержимое массива. Как сделать, чтобы считав данные из xml и записав их в массив, можно было использовать вне этой функции.

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

Nik_M 16.04.2008 14:22

Я понял.
Но получается что теперь каждый раз когда мне необходимо произвести какие-то действия с данными из xml, я должен вызывать метод onLoad и в нем уже их(действия) описывать? Или же можно сделать, как Вы написали, в другой последовательности?
P.S: Прошу прощения за назойливость...

iNils 16.04.2008 14:34

Нет. Ваша задача, это изменить время и место выполнения основного кода и понять почему именно так, а не иначе.
Вы пишите так:
Код:

var arr:Array = new Array ();
var xml:XML = new XML ();
xml.ignoreWhite = true;
xml.onLoad = function (success:Boolean) {
        if (success) {
                for (var i = 0; i < this.childNodes.length; i++) {
                        var node_info = this.childNodes[i].firstChild;
                        arr[i] = node_info;
                }
                trace (arr);
        }
};
xml.load ("xml.xml");
//// ниже пошел ваш основной код

А надо писать так
Код:

import mx.utils.Delegate;
var arr:Array = new Array ();
var xml:XML = new XML ();
xml.ignoreWhite = true;
xml.onLoad = Delegate.create (this, onLoadXML);
xml.load ("xml.xml");
////
function onLoadXML (success:Boolean) {
        if (success) {
                for (var i = 0; i < xml.childNodes.length; i++) {
                        var node_info = xml.childNodes[i].firstChild;
                        arr[i] = node_info;
                }
                mainCode ();
        }
}
function mainCode () {
        //// Теперь ваш основной код тут
}

Таким образом, мы переместили код из кадра в функцию (изменили место) и эта функция срабатывает после onLoad и весь код соотвественно тоже (изменили время), а не сразу.

Если вы бегали эстафету, то должны понять. Участник номер 2 ждет участника номер 1 и только потом бежит. А у вас сразу же после старта первго участника, второй тоже начинал бежать, но без палки.

Nik_M 16.04.2008 15:08

Спасибо Вам большое, это я и хотел узнать.
P.S: У Вас очень хорошо и доходчиво получается объяснять, особенно на примерах из жизни, сразу становится все понятно!!
Еще раз выражаю свою благодарность!


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

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