我真的需要为URLLoader设置事件处理程序吗?

时间:2014-06-09 20:25:19

标签: actionscript-3 flash

我是动作脚本的新手,我正在接受Joseph Devore的教程。据我所知,当我想进行网络查询时,我可以创建一个URLRequest,并使用URLLoader发送它。我希望在URLLoader.data属性中找到响应数据,但在进行查询后,在我的情况下这仍然是null。然后我似乎必须创建一个事件处理来实际访问响应。这是真的?

我编写了这个小示例代码,并想知道我(最简单的方法)如何在此get请求中访问响应。

package
{
    import flash.events.Event;
    import flash.net.URLLoader;
    import flash.net.URLRequest;

    public class stackQuery
    {
        public function stackQuery()
        {
        }

        public function makeQuery(): String {
            var request: URLRequest = URLRequest("http://www.google.com");
            var loader: URLLoader = new URLLoader();
            loader.addEventListener(Event.COMPLETE, handleResponse);
            try{
                loader.load(request);
            }
            if(loader.data == null){
                 return "Empty"
            }
            return "data not empty"
            }

            private function handleResponse(event:Event):void
            {
                //something with event.target.data here??
            }
    }
}

3 个答案:

答案 0 :(得分:1)

是的,当然是真的。想象一下,您加载了一兆字节的数据。你需要时间才能加载它,对吧?因此,您无法在下一行代码中获得此数据。

当目标调度事件时,侦听器将被执行 - 在您加载该兆字节的情况下。

这是正常行为。

答案 1 :(得分:1)

使用AS3进行同步加载(就像在其他一些语言中一样)没有任何好方法。您的数据为空,因为在AS3中,load命令是异步的 - 这意味着它不会停止应用程序的其余部分(将其锁定),直到加载完成,它将移动到下一行代码并调度一次事件负载完成。

以下是您希望如何根据您提供的代码处理此问题的代码示例:

package
{
    import flash.events.Event;
    import flash.events.IOErrorEvent;
    import flash.events.SecurityErrorEvent;
    import flash.net.URLLoader;
    import flash.net.URLRequest;

    public class stackQuery
    {
        private var loader: URLLoader = new URLLoader(); //let's move it out to the class level so you can easily reference it from other methods (though this is purely optional)

        public function stackQuery()
        {
        }

        public function makeQuery(): String {
            var request:URLRequest = URLRequest("http://www.google.com");


            //add you listeners before loading
            loader.addEventListener(Event.COMPLETE, handleResponse);
            loader.addEventListener(IOErrorEvent.IO_ERROR, handleResponse); //it's good practice to also listen for errors
            loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, handleResponse); //this kind of error will happen if you're trying to load a local resource but have published as network only (or vice-versa)

            //load the request, any code after this will run before the load completes. 
            loader.load(request);
        }

            //this function will run once the load completes
        private function handleResponse(event:Event):void
        {
            if (event is IOErrorEvent) {
                //you had an IO error, better do something 
                return;
            }

            if (event is SecurityErrorEvent) {
                //url wasn't allowed to load
                return;
            }

            trace(loader.data); //this is what was returned from the page
                //you could also get it by referencing the currentTarget of the event
                trace(URLLoader(event.currentTarget).data);
        }
    }
}

答案 2 :(得分:1)

虽然给出的答案是正确的,但真正的解释是,Actionscript 3是一种异步语言,而不是像Python这样的其他语言,它们是同步的。在加载类似url之类的python之后,下一行代码将不会被执行,直到加载url(可能会产生延迟或空闲执行),在Actionscript 3中,代码执行不会等待并继续下一行线。这就是您需要使用事件的原因(Actionscript 3是一种基于事件的语言),因此您可以在代码仍在执行时找到所有等待的数据。