2011-01-23 2 views
0

У меня, кажется, есть некоторые посторонние символы в объекте, я новичок в ActionScript, поэтому я не знаю, принадлежат ли они там или нет, и я не могу показаться извлеките интересующий параметр. Вот фрагмент кода:Actionscript 2 проблема с возвратом loadvars из запроса

_root.buttonBkg.onPress = function() { 
    var wikiload1:LoadVars = new LoadVars(); 
    var wikiload2:LoadVars = new LoadVars(); 
    wikiload1.wikiname = wikiterm; 
    wikiload2.onLoad = function(success:Boolean) { 
    trace("entered wikiload1.onLoad function") 
    if (success) { 
    _root.createTextField("wikidisplay", _root.getNextHighestDepth(), 0, 150, 550, 380); 
    _root.wikidisplay.html = true; 
    _root.wikidisplay.htmlText = wikiload2.displayhtml; 
    trace("wikiload2.displayhtml is" + wikiload2.displayhtml); 
    trace(wikiload2.toString()); 
    trace("success route"); 
    } 
    else { 
    _root.createTextField("wikidisplay", _root.getNextHighestDepth(), 0, 150, 550, 380); 
    _root.wikidisplay.text = "Error connecting to server."; 
    trace("error route"); 
    } 
    }; 
    wikiload1.sendAndLoad("http://myURL.script.py", wikiload2, "POST"); 
    trace("?wikiname=" + wikiload1.wikiname); 
    trace("did the sendAndLoad") 
    } 

Вот результаты трассировки:

~/SRC/Main.as: 70: ВикиИмя = кофе

~/SRC/Main.as: 71: сделал sendAndLoad

~/SRC/Main.as: 53: введены функции wikiload1.onLoad

~/SRC/Main.as: 58: wikiload2.displayhtml isundefined

~/src/Main.as: 59:% 0Adisplayhtml =% 3Cp% 3E% 3Cb% 3ECoffee% 3C% 2Fb% 3E% 3C% 2Fp% 3E% 3Cp% 3E% 3Cbr% 2F% 3E% 3Cbr% 2F% 3ECoffee% 20is% 20a% 20brewed% 20drink% 20prepared% 20 [НАМНОГО возвращенное значение УДАЛИТЬ, это длинно] DIV% 3E% 0A & OnLoad =% 5Btype% 20Function% 5D

~/SRC/Main.as: 60: Успешный маршрут

Почему wikiload2.displayhtml не определен? Является ли это ошибкой ActionScript или у меня есть некоторые проблемы с вызовом скрипта (сценарий python на веб-сервере).

ответ

1

Независимо от того, есть ли у вас проблемы с сервером python, вы должны проверить с помощью анализатора прокси, например Charles, Fiddler или даже FireBug. Результат выглядит отлично, хотя я не уверен, что символ новой строки% 0A, который вы видите в трассировке (wikiload2.toString), вызывает проблемы с разбором loadVars. Попробуйте сначала удалить это.

Я не уверен, что это исправление, но вы говорите, что вы новичок в AS2, поэтому позвольте мне пойти дальше с вашим кодом для дальнейшего использования. Я предполагаю, что есть причина, по которой вы должны быть в AS2 и не можете работать с AS3. Однако даже с AS2 я настоятельно призываю вас взглянуть на объектно-ориентированное программирование. Как только вы это сделаете, вам будет намного легче структурировать ваш код, работать с сторонними структурами и поддерживать уровень ремонтопригодности ваших проектов.

В рамках, например, один из них называется ASAPFramework. Он имеет очень простой объект под названием LoadVarsXML, который позволит загружать результат загрузки как объект XML. Лучше отлаживать структуру loadVars как в python, так и во flash.

Другой совет; В AS2 область вызова метода может быть другой, чем область описания метода. Другими словами, переменные, которые определены в том же объекте, что и метод, могут быть недоступны, когда вы передаете этот метод для выполнения в обратных вызовах событий, например onLoad. Один из способов обойти это - хранить все значения во всем мире, как вы делаете с префиксом _root. Это, однако, делает ваш код трудно читать, трудно понять и, как вы заметили, трудно отлаживать. * Использование _root в целом, большой нет-нет *. Если вы продолжите расширять свой примерный сценарий выше, вы, в конце концов, окажетесь в спагетти кода, который никто, кого вы попросите помочь, не сможет понять.

Путь к этому заключается в том, что вы используете классы вместо сценариев фреймов, но даже если вы хотите их придерживаться, вы можете немного почистить вещи, обернув методы обратного вызова с помощью делегирования. Scope (scope, method).

Вот как ваш код будет выглядеть с использованием метода Delegate.create.Я также взял на себя смелость переписать ваши переменные wikiLoad1 и 2 в wikiLoader и wikiResults. Это делает его более ясным, каковы их задачи.

_root.buttonBkg.onPress = Delegate.create(this, handleButtonPress); 

function handleButtonPress():Void { 
    var wikiResult:LoadVars = new LoadVars(); 
    wikiResult.onLoad = Delegate.create(this, handleWikiLoad); 

    var wikiLoader:LoadVars = new LoadVars(); 
    wikiLoader.wikiname = wikiterm; 
    wikiLoader.sendAndLoad("http://myURL.script.py",wikiResult,"POST"); 
    trace("?wikiname=" + wikiLoader.wikiname); 
    trace("did the sendAndLoad"); 
} 

function handleWikiLoad(success:Boolean):Void { 
    trace("entered wikiLoader.onLoad function"); 
    if (success) { 
     _root.createTextField("wikidisplay",_root.getNextHighestDepth(),0,150,550,380); 
     _root.wikidisplay.html = true; 
     _root.wikidisplay.htmlText = wikiResult.displayhtml; 
     trace("wikiResult.displayhtml is" + wikiResult.displayhtml); 
     trace(wikiResult.toString()); 
     trace("success route"); 
    } else { 
     _root.createTextField("wikidisplay",_root.getNextHighestDepth(),0,150,550,380); 
     _root.wikidisplay.text = "Error connecting to server."; 
     trace("error route"); 
    } 
} 

Я думаю, что это выглядит намного чище и поэтому его легче понять. Как сказано, попробуйте удалить символ новой строки в python, и если вы можете, проверьте LoadVarsXML с ASAP. Это серьезно упростит жизнь в AS2.

+0

Большое спасибо! Ваша оценка кода оценена. Кстати, да, как бы то ни было, мой код работал бы, если бы у меня было меньше новой строки, создаваемой скриптом, который он вызывал (который теперь исправлен). Я проведу ASAPFramework, если я получу больше. Этот проект является одним из приложений Chumby (поэтому ему необходимо использовать ActionScript 2, а не 3). – ViennaMike

Смежные вопросы