PDA

Просмотр полной версии : sendAndLoad в функции


totruok
15.05.2009, 00:16
Здравствуйте, столкнулся с проблемой, что у меня игнорируется sendAndLoad в функции

getV = function (v1) {
sendvar.sendAndLoad(SERVER, varxml, "POST");
varxml.onLoad = function() {
vr=varxml.firstChild.firstChild.nodeValue;
trace("Загрузил");
}
return vr;
}

dimarik
15.05.2009, 00:26
Внимательно изучите пример работы LoadVars в соответствующем разделе документации.

totruok
15.05.2009, 02:01
В Вы не могли бы всё же помочь? Я смотрел документацию, но так и не нашёл ответа на свой вопрос

dimarik
15.05.2009, 02:23
Сдается мне, что Вы смешали методы sendAndLoad классов XML и LoadVars. Вы ожидаете в ответе XML, а LoadVars ожидает в ответе пары [имя=значение], разделенные '&'. Так понятнее?

totruok
15.05.2009, 02:51
Но без функции у меня всё работает 0_о

dimarik
15.05.2009, 03:08
Гм. Пути флеша неиспобедимы. Мой косяк.
По Вам: асинхронная операция загрузки не может моментально вернуть результат. То есть, Вы надеятесь получить результат просто вызвав getV. Она вернет undefined, потому что не будет ждать окончания загрузки.

Вам необходимо продолжить работу после получения ответа. вот и всё
var app:Object = this;

varxml.onLoad = function(success:Boolean) {
if (success) {
trace("Загрузил");
app.processResponce(this);
} else {
trace("Oooops!");
}

};

sendvar.sendAndLoad(SERVER, varxml, "POST");


function processResponce(value:XML):Void {
var vr:String = value.firstChild.firstChild.nodeValue;
// go up!
}

totruok
15.05.2009, 03:31
У меня там всё же в функции есть что то я просто это вырезал для наглядности и структуру мне желательно такую же оставить, я попытался Ваш код переписать, всё равно не работает.

getV = function (v1) {
//тоесть тут бла бла бла зависящий от v1 и влияющий на sendvar
sendvar.sendAndLoad(SERVER, varxml, "POST");
varxml.onLoad = function() {
vr=varxml.firstChild.firstChild.nodeValue;
trace("Загрузил");
}
return vr;
}

dimarik
15.05.2009, 03:51
Ну не вернет getV ожидаемое значение! потому что varxml.firstChild.firstChild.nodeValue на момент начала загрузки не существует. Дождитесь окончания загрузки. потом и спрашивайте свой vr.


function getV(v1):Void {

//тоесть тут бла бла бла зависящий от v1 и влияющий на sendvar

var app:Object = this;

varxml.onLoad = function(success:Boolean) {
if (success) {
trace("Загрузил");
app.processResponce(this);
} else {
trace("Oooops!");
}

};

sendvar.sendAndLoad(SERVER, varxml, "POST");
}

function processResponce(value:XML):Void {
var vr:String = value.firstChild.firstChild.nodeValue;
// go up!
}

iNils
15.05.2009, 03:52
Такая структура работать не будет.
getV = function (v1) {
//тоесть тут бла бла бла зависящий от v1 и влияющий на sendvar
sendvar.sendAndLoad(SERVER, varxml, "POST");
varxml.onLoad = function() {
vr=varxml.firstChild.firstChild.nodeValue;
trace("Загрузил");
}
return vr;
}
Сначала выполняется желтая часть, а потом, когда нибудь, голубая.
Как видите return vr находится в желтой части, а vr=varxml.firstChild.firstChild.nodeValue; в голубой, поэтому будете получать undefined

totruok
15.05.2009, 04:05
А как в таком случае приостановить выполнение функции, пока не придёт ответ?

etc
15.05.2009, 07:56
Никак, запускайте какую-нибудь функцию в обработчике onLoad.

totruok
15.05.2009, 12:19
Не могли бы вы пояснить?

Michaael
15.05.2009, 12:29
Запускайте функцию, которая обрабатывает переменные и вообще продолжает работу, внутри функции onLoad...