PDA

Просмотр полной версии : вопрос по XML(function return)


MrXoT
16.04.2008, 11:59
у меня такая проблема я не могу сделать вывод функции 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
Как только вы начали подгружать внешние данные, можете забыть про линейность выполнения кода, все действеия теперь фнутри методов и событий.

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

все равно не работает, внутри функции массив заполняется, а вот после уже пустой:(Все наоборот. Вы путаете последовательность действий.
Если написать такой код
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
А мне то нужно чтобы "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: У Вас очень хорошо и доходчиво получается объяснять, особенно на примерах из жизни, сразу становится все понятно!!
Еще раз выражаю свою благодарность!