Actionscript 2 проблема с возвратом loadvars из запроса - PullRequest
0 голосов
/ 23 января 2011

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

_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:? Wikiname = coffee

~ / 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% 20 заварен% 20 выпил% 20 подготовлен% 20 [УДАЛЕНО МНОГО ВОЗВРАЩЕННОЕ ЗНАЧЕНИЕ, ЭТО ДОЛГО] div% 3E% 0A & onLoad =% 5Btype% 20Function% 5D

~ / src / Main.as: 60: путь к успеху

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

1 Ответ

1 голос
/ 23 января 2011

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

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

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

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

Способ обойти это, начав использовать классы вместо рамочных сценариев, но даже если вы захотите придерживаться их, вы уже можете немного их очистить, обернув методы обратного вызова с Delegate.create (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.

...