2014-06-09 93 views
0

我是新来的动作,我正在按照约瑟夫德沃尔的教程。我明白,当我想要做一个网络查询时,我可以创建一个URLRequest,并用URLLoader发送。我期望在URLLoader.data属性中找到响应数据,但是在完成查询之后,在我的情况下这仍然为空。然后,我似乎必须创建一个事件处理来实际访问响应。这是真的?我真的需要为URLLoader提供一个事件处理程序吗?

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

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

我不认为有什么好办法做一个同步负载(就像你可以在一些其他语言)。 – BadFeelingAboutThis

回答

1

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

这里,你会如何想这个基于关闭您提供的代码来处理代码示例:

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); 
     } 
    } 
} 
1

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

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

这是一个正常的行为。

+0

那么我应该在handleResponse()中添加什么,以便makeQuery()将返回字符串“data not empty”? – stian

+0

@安德瑞所说的是,你不能指望从'makeQuery'返回任何有意义的东西。 – Marcela

+0

@marcela。这意味着makeQuery实际上有时间在handleResponse被调用之前完成? – stian

1

虽然给出的答案是正确的,真正的解释是,ActionScript 3的是一个异步的语言而不是像Python这样的其他语言,它们是同步的。在python加载类似url之后,下一行代码将不会被执行,直到url被加载(这可以创建滞后或空闲执行),在ActionScript 3中,代码执行不会等待并移动到下一行。这就是您需要使用事件的原因(Actionscript 3是一种基于事件的语言),因此您可以了解当您的代码仍在执行时,您所等待的数据何时可用。

+0

动作脚本**是具有异步功能的同步语言,如Event系统。这个特定的问题是使用异步调用的很好的例子。但是如果你不处理事件,大多数事情都是同步的。 –

相关问题