Javascript Tianium HTTPClient在使用结果之前未运行
我有一个奇怪的问题,在过去的几个小时里我一直把头撞在墙上 我正在Appcelerator Titanium中开发一个iPhone应用程序,它目前希望等到运行了其他代码之后,才能获得几个HTTPClient请求的结果,尽管我在尝试使用它们的结果之前会给它们打电话Javascript Tianium HTTPClient在使用结果之前未运行,javascript,iphone,httpclient,titanium,Javascript,Iphone,Httpclient,Titanium,我有一个奇怪的问题,在过去的几个小时里我一直把头撞在墙上 我正在Appcelerator Titanium中开发一个iPhone应用程序,它目前希望等到运行了其他代码之后,才能获得几个HTTPClient请求的结果,尽管我在尝试使用它们的结果之前会给它们打电话 function getMarkers(e, miles){ //The function with the HTTPClient calls that are firing last, trimmed to have only the
function getMarkers(e, miles){ //The function with the HTTPClient calls that are firing last, trimmed to have only the relevant code.
var markers = [];
Ti.API.info("Getting markers");
xhr.onload = function()
{
var data = Ti.XML.parseString(this.responseText);
var ref = data.documentElement.getElementsByTagName("reference");
for(var i =0; i < ref.length; i++){
var marker = new Object();
marker.ref = ref.item(i).text;
var request = Titanium.Network.createHTTPClient();
request.setTimeout(10000);
request.onload = function(){
var data = Ti.XML.parseString(this.responseText);
marker.address = data.documentElement.getElementsByTagName("formatted_address").item(0).text;
if(data.documentElement.getElementsByTagName("formatted_phone_number") != null){
marker.phone = data.documentElement.getElementsByTagName("formatted_phone_number").item(0).text;
} else {
marker.phone = null;
}
marker.icon = data.documentElement.getElementsByTagName("icon").item(0).text;
marker.lat = data.documentElement.getElementsByTagName("lat").item(0).text;
marker.lng = data.documentElement.getElementsByTagName("lng").item(0).text;
marker.name = data.documentElement.getElementsByTagName("name").item(0).text;
if(data.documentElement.getElementsByTagName("url") != null) {
marker.url = data.documentElement.getElementsByTagName("url").item(0).text;
} else {
marker.url = null;
}
markers.push(marker);
Ti.API.info(markers.length);
}
request.open("GET","https://maps.googleapis.com/maps/api/place/details/xml?reference=" + marker.ref + "&sensor=true&key=" + Ti.App.apiKey);
request.send();
}
};
xhr.open("GET","https://maps.googleapis.com/maps/api/place/search/xml?location=" + googleLatLng + "&radius=" + radius + "&types=" + Ti.App.types + "&sensor=true&key=" + Ti.App.apiKey);
xhr.send();
return markers;
}
// actually draw the markers on the map
function drawMap(markers, currentLoc)
{
var i;
Ti.API.info("Adding markers...");
for(i=0;i<markers.length;i++)
{
Ti.API.info("Marker " + i);
Ti.API.info(markers[i].name);
var ann = Titanium.Map.createAnnotation({
image:markers[i].icon,
animate:true,
latitude:markers[i].lat,
longitude:markers[i].lng,
title:markers[i].name,
subtitle:markers[i].address
});
if(markers[i].url != null){
ann.rightButton = markers[i].url;
}
mapview.addAnnotation(ann);
}
Ti.API.info("Markers added"); //When this block is called, markers.length == 0
}
// find the user's location and mark it on the map
function waitForLocation(e)
{
//Do stuff about finding current location and marking it on the map. This stuff works and a pin drops for the current location
drawMap(getMarkers(e), currentLoc);
}
这意味着它将进入getMarkers函数(第一行),然后离开它(接下来的两行),然后返回getMarkers函数以实际获取标记(最后四行,markers.length
作为每个标记添加时的输出)。知道
根据我在这里找到的答案,我将.open()
调用从.onload()
调用之前移动,但无论.open()
是在.onload()之前还是之后,我都得到了相同的结果
我找到了httpClient调用异步执行其任务的信息(API引用中缺少的重要信息)。知道了这一点,它离开函数是有意义的,但它确实会影响信息的处理方式,因为我需要在尝试添加标记之前下载标记
在与我的iPhone开发者同事交谈时,他提到他使用委托和delegate.connectiondFinishLoading调用来处理这些问题。也许,有没有一种方法可以钩住它,或者我可以使用它的钛合金实现
有没有其他好方法可以确保在应用程序实际下载标记之前,它不会尝试加载标记?它只需要在iPhone上工作,所以iPhone特定的选项就可以了。经过大量的搜索和梳理,我终于成功地让它按我需要的方式工作了
.open()
有第三个布尔参数,强制HTTPClient同步运行(文档中未提及的另一个技巧)。将其设置为false
将使其同步运行。这样做使我能够按照预期的运行顺序测试代码
我还发现我无法创建一个所有标记的数组并一次加载它们,因此我调整了addMarker()
函数,使其仅获取一个标记,并在获取标记数据的循环中调用它。一旦我开始工作,我就能够再次使HTTPClient调用异步。经过大量搜索和梳理,我终于成功地使它以我需要的方式工作
.open()
有第三个布尔参数,强制HTTPClient同步运行(文档中未提及的另一个技巧)。将其设置为false
将使其同步运行。这样做使我能够按照预期的运行顺序测试代码
我还发现我无法创建一个所有标记的数组并一次加载它们,因此我调整了addMarker()
函数,使其仅获取一个标记,并在获取标记数据的循环中调用它。一旦我开始工作,我就能够再次使HTTPClient调用异步。在Android上,从UI线程开始的任何任务,尤其是网络活动,都需要从SDK 2.3开始异步。在Android上,从UI线程开始的任何任务,特别是网络活动,都需要从SDK 2.3开始异步。我想补充一点,我发现您的问题与此问题完全相同。然而,我正在为iPhone和Android开发,我发现.open()的神秘第三个参数在Android中不起作用(典型…)。是的,这是让我对Ti感到失望的原因之一。我们的Android和iPhone项目是分开的(当然,这会破坏使用Ti的一半目的),但我们甚至不能希望将它们集成在一起,因为由于支持水平的不同,有太多的东西必须以不同的方式实现。我想补充一点,我发现你的问题也有完全相同的问题。然而,我正在为iPhone和Android开发,我发现.open()的神秘第三个参数在Android中不起作用(典型…)。是的,这是让我对Ti感到失望的原因之一。我们的Android和iPhone项目是分开的(当然,这会破坏使用Ti的一半目的),但我们甚至不能希望将它们集成在一起,因为由于支持水平的不同,有太多的东西必须以不同的方式实现。
[INFO] Getting markers
[INFO] Adding markers...
[INFO] Markers added
[INFO] 1
[INFO] 2
[INFO] 3
[INFO] 4