Flash AS3:如何访问onComplete函数之外的URLLoader请求的输出?

Flash AS3:如何访问onComplete函数之外的URLLoader请求的输出?,flash,actionscript,urlloader,Flash,Actionscript,Urlloader,我试图在onComplete函数中访问data_file值,但老实说,我甚至不确定我是否正确调用了它 public function version():String{ var string_val = ""; var data_file = ""; //var request:URLRequest = new URLRequest("indexdynamic.php"); var request:URLRequest = new URLRequest("htt

我试图在onComplete函数中访问data_file值,但老实说,我甚至不确定我是否正确调用了它

public function version():String{
    var string_val = "";
    var data_file = "";

    //var request:URLRequest = new URLRequest("indexdynamic.php");
    var request:URLRequest = new URLRequest("http://localhost/indexdynamic.php");
        request.method = URLRequestMethod.POST;

    var verVars:URLVariables = new URLVariables();

    request.data = verVars

    var loader:URLLoader = new URLLoader(request);
    loader.addEventListener(Event.COMPLETE, onComplete);
    loader.dataFormat = URLLoaderDataFormat.VARIABLES;
    loader.load(request);

    function onComplete(event:Event):String{
        string_val = event.target.data.Var.toString();

        if (string_val ==  "First Selection") {
            data_file = "fill_in_blanks_doi.xml";
        }else {
            data_file = "fill_in_blanks_2_doi.xml";
        }
        return data_file;
    }
    var data_file = onComplete(loader.COMPLETE);
    return data_file;
}

您必须通过将数据写入在方法之外声明的变量来提供对数据的访问。

通常,事件侦听器函数返回void。因此,您不会通过返回值从事件侦听器获取值

因此,第一步:

删除:
var data\u file=onComplete(loader.COMPLETE)
删除:
返回数据\u文件//删除两行。返回一个值。
将函数标题更改为返回void:

function onComplete(event:Event):void{
现在,您已经保存了“data_file”变量,并且不会意外地覆盖它。但是,因为这是一个异步操作,所以现在您已经设置了变量,代码的某些部分正在等待调用。您需要在onComplete()中再添加一行,以继续在应用程序中执行代码。可能是这样的:

processXML(data_file);

希望这能帮你澄清

==编辑===

我回去又读了一遍你的代码,我注意到了其他一些东西。您正在函数中声明函数。这通常不是个好主意。我建议将onComplete()函数移到getVersion()函数之外

其次-getVersion()函数返回一个字符串,这意味着它是一个同步函数-表示调用代码期望立即返回一个响应。这是行不通的。URLLoader是异步的——您可以调用它,并且在将来的某个不确定的时刻它会响应。因此,当您的代码从服务器获得响应并传输数据时,您可以自由地执行其他操作,比如显示加载程序条。完成后,laoder将调用其侦听器。只有在这一点上,您描述版本的最初目标才可能实现


因此-您需要更改代码以暂停其执行,直到加载完成,然后让onComplete侦听器在信息加载并准备好使用后再次开始滚动。

您始终可以将输出存储到全局数组中,该数组可以从应用程序中的任何位置访问

var myArray:Array = new Array();

function onComplete(e:Event):void {
   myArray.push(e.target.data);
}

我试图创建一个名为data_file的实例变量,并在onComplete()中使用“this.data_file=…”对其进行修改,但它不起作用。我可以在version()中设置data_file变量,但我猜“this”的范围没有达到嵌套的第二级。有什么建议吗?是的,有,但你似乎想同步进行。在回调中,更好地调用方法以继续代码。此外,我建议避免深层方法嵌套。这是ActionScript2的风格,而不是惯用的ActionScript3。我刚刚看到了这一点,这是一个很好的回应。谢谢
var myArray:Array = new Array();

function onComplete(e:Event):void {
   myArray.push(e.target.data);
}