我是动作脚本的新手,我正在接受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??
}
}
}
答案 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是一种基于事件的语言),因此您可以在代码仍在执行时找到所有等待的数据。