Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Tianium HTTPClient在使用结果之前未运行_Javascript_Iphone_Httpclient_Titanium - Fatal编程技术网

Javascript Tianium 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

我有一个奇怪的问题,在过去的几个小时里我一直把头撞在墙上

我正在Appcelerator Titanium中开发一个iPhone应用程序,它目前希望等到运行了其他代码之后,才能获得几个HTTPClient请求的结果,尽管我在尝试使用它们的结果之前会给它们打电话

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