2013-06-01 52 views
0

我有一个函数,它有一个for循环中的数据,数据被传递到我的函数,该函数将数据放入一个URL加载器,加载它,并返回数据来自加载的网址。这不起作用,因为如果我尝试这样做没有停止的URL不足以快速返回数据。我找不到停止的方法,以免造成错误。我不能使用事件侦听器,因为它们不能返回值,而且我不能仅仅创建一个函数来将数据分配给变量,因为在使用URLloader调用函数的函数中需要它。我可以制作一张图来更好地解释。我不太确定这是否可能,如果我需要重构我的代码。我已经尝试了这两种方式: 这导致堆栈溢出:等待加载URL返回数据AS3

package app 
{ 
    import flash.xml.XMLDocument; 
    import flash.net.URLLoader; 
    import flash.net.URLRequest; 
    import flash.events.Event; 
    import flash.display.MovieClip; 

    public class main extends MovieClip 
    { 
     var geoReq:URLRequest = new URLRequest; 
     var geoLoader:URLLoader = new URLLoader(); 
     var GeocodeResponse:XML; 
     var geoLocList:XMLList = new XMLList(); 
     var geoLoc:Array = new Array(); 
     function main():void 
     { 
      var urlReq:URLRequest = new URLRequest("http://search.twitter.com/search.atom?q=flu&rpp=3&lang=en&geocode=55.378051,-3.435973,605mi"); 
      var loader:URLLoader = new URLLoader(); 
      loader.addEventListener(Event.COMPLETE, getTweets); 
      loader.load(urlReq); 
     } 
     function getTweets(e:Event):void 
     { 
      if (e.target.data) 
      { 
       var tweets = new Array(); var times = new Array(); 
       var twitterXML:XML = new XML(e.target.data); 
       var tweetList:XMLList = twitterXML.children(); 
       var tweetItem:String; 
       var placeItem:String; 
       var tweet:Array = new Array(); 
       for (var i:int = 0; i < tweetList.length(); i++) 
       { 
        tweetItem = tweetList[i].*::title; 
        placeItem = tweetList[i].*::location; 
        if(tweetItem && placeItem != "") 
        { 
        placeItem = loadGeo(placeItem); 
        tweet = [tweetItem, placeItem]; 
        tweets.push(tweet); 
        trace(tweets[tweets.length - 1][0]); 
        trace(tweets[tweets.length - 1][1]); 
        } 
       } 
       trace(tweets.length); 
      } 
     } 
     function loadGeo(loc:String):Array 
     { 
      geoReq = new URLRequest("https://maps.googleapis.com/maps/api/geocode/xml?address="+loc+"&sensor=false"); 
      geoLoader.load(geoReq); 
      GeocodeResponse = new XML(geoLoader.data); 
      geoLoc = returnLoc(); 
      return geoLoc; 
     } 
     function returnLoc():Array 
     { 
      if(geoLoader.data == null) 
      { 
       returnLoc(); 
      } 
      else 
      { 
       var returnD:Array = new Array(GeocodeResponse.result.geometry.location[0].lat, GeocodeResponse.result.geometry.location[0].lng); 
      } 
      return returnD; 
     } 
    } 
} 

,这将导致错误“类型错误:错误#1010:A项是不确定的,没有属性”:

package app 
{ 
    import flash.xml.XMLDocument; 
    import flash.net.URLLoader; 
    import flash.net.URLRequest; 
    import flash.events.Event; 
    import flash.display.MovieClip; 

    public class main extends MovieClip 
    { 
     var geoReq:URLRequest = new URLRequest; 
     var geoLoader:URLLoader = new URLLoader(); 
     var GeocodeResponse:XML; 
     var geoLocList:XMLList = new XMLList(); 
     var geoLoc:Array = new Array(); 
     function main():void 
     { 
      var urlReq:URLRequest = new URLRequest("http://search.twitter.com/search.atom?q=flu&rpp=3&lang=en&geocode=55.378051,-3.435973,605mi"); 
      var loader:URLLoader = new URLLoader(); 
      loader.addEventListener(Event.COMPLETE, getTweets); 
      loader.load(urlReq); 
     } 
     function getTweets(e:Event):void 
     { 
      if (e.target.data) 
      { 
       var tweets = new Array(); var times = new Array(); 
       var twitterXML:XML = new XML(e.target.data); 
       var tweetList:XMLList = twitterXML.children(); 
       var tweetItem:String; 
       var placeItem:String; 
       var tweet:Array = new Array(); 
       for (var i:int = 0; i < tweetList.length(); i++) 
       { 
        tweetItem = tweetList[i].*::title; 
        placeItem = tweetList[i].*::location; 
        if(tweetItem && placeItem != "") 
        { 
        placeItem = loadGeo(placeItem); 
        tweet = [tweetItem, placeItem]; 
        tweets.push(tweet); 
        trace(tweets[tweets.length - 1][0]); 
        trace(tweets[tweets.length - 1][1]); 
        } 
       } 
       trace(tweets.length); 
      } 
     } 
     function loadGeo(loc:String):Array 
     { 
      geoReq = new URLRequest("https://maps.googleapis.com/maps/api/geocode/xml?address="+loc+"&sensor=false"); 
      geoLoader.load(geoReq); 
      GeocodeResponse = new XML(geoLoader.data); 
      geoLoc = [GeocodeResponse.result.geometry.location[0].lat, GeocodeResponse.result.geometry.location[0].lng]; 
      return geoLoc; 
     } 
    } 
} 

请帮忙,提前致谢凯尔。

回答

1

您正在等待完成search.twitter.com请求,但您不等待完成地理编码请求。这是错误。每次使用Loader时,都会使用异步等待。

+0

有反正我可以使用同步等待,以便我可以使用从geoLoader()返回的数据放入tweet []数组? – FishBowl

+0

当然,但您必须将'geoloader.load()'后面的代码移动到'Event.COMPLETE'事件处理程序中。请注意,由于您现在正在请求多个地理编码,因此您必须设计一个功能来确定哪个地理编码加载器分派“完成”事件,并通过解析结果向Twitter添加正确的地理编码数据。 – Vesper

+0

我已经这样做,但像我的其他代码我意识到,数据还没有从谷歌的API API检索之前,我尝试将其分配给一个变种,因此它输出空值:/ – FishBowl