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;
}
}
}
请帮忙,提前致谢凯尔。
有反正我可以使用同步等待,以便我可以使用从geoLoader()返回的数据放入tweet []数组? – FishBowl
当然,但您必须将'geoloader.load()'后面的代码移动到'Event.COMPLETE'事件处理程序中。请注意,由于您现在正在请求多个地理编码,因此您必须设计一个功能来确定哪个地理编码加载器分派“完成”事件,并通过解析结果向Twitter添加正确的地理编码数据。 – Vesper
我已经这样做,但像我的其他代码我意识到,数据还没有从谷歌的API API检索之前,我尝试将其分配给一个变种,因此它输出空值:/ – FishBowl