0

我似乎在对象中有一些无关的字符,我是 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 未定义

~/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 错误,还是我对它调用的脚本(Web 服务器上的 python 脚本)有一些问题。

4

1 回答 1

1

无论你的 python 服务器是否有问题,你都应该使用代理嗅探器进行检查,比如CharlesFiddler甚至FireBug。结果看起来不错,尽管我不确定您在跟踪中看到的换行符 %0A (wikiload2.toString) 是否导致 loadVars 解析出现问题。尝试先删除它。

我不确定这是解决方法,但您说您是 AS2 的新手,所以让我进一步介绍您的代码以供将来参考。我假设您必须使用 AS2 并且无法使用 AS3 是有原因的。然而,即使是使用 AS2,我还是敦促您研究面向对象的编程。一旦你这样做了,构建代码、使用 3rd 方框架并保持项目的可维护性将变得更加容易。

例如,在框架中,有一个叫做ASAPFramework。它有一个非常简单的对象,称为 LoadVarsXML,它可以让您将加载结果作为 XML 对象加载。比 python 和 flash 中的 loadVars 结构更好地调试。

另一个建议;在 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。它将严重简化 AS2 中的生活。

于 2011-01-23T12:29:51.193 回答