Titanium HTTPClient返回太“快”

时间:2012-01-29 20:45:01

标签: javascript httpclient titanium return appcelerator

我有以下功能:

  getTasks: function()
    {
        var taskRequest = Titanium.Network.createHTTPClient();
        var api_url = 'http://myawesomeapi.heroku.com/users/' + Ti.App.Properties.getString("userID") + '/tasks';

        var tasks = [];
        taskRequest.onload = function() {
            var response = JSON.parse(this.responseText), 
            len = response.length,
            i = 0,
            t;

            for(; i < len; i++)
            {
                task = response[i];
                var newTask = {};
                newTask.rowID = i;
                newTask.title = task.title;
                newTask.description = task.description;
                newTask.id = task.id;
                newTask.hasChild = true;

                tasks.push(newTask);
            }

            alert(tasks);
        }

        taskRequest.open('GET', api_url, false);
        taskRequest.setRequestHeader('Content-Type', 'application/json');
        taskRequest.send();

        alert(tasks);
            // return tasks;
    }

此功能在我的控制器中;当我需要加载数据时,我在我的视图中调用它。但是,我希望return这些数据,以便我可以将它分配给视图中的变量。

现在发生的是它会让空虚回归。最后一个警报(底部一个)似乎运行得太快而且它返回一个空数组,而只有在onload函数完成后才会收到警报的那个警告包含了我需要的内容。

现在我明显的问题是,如何让我的函数返回带有数据的数组,而不是没有?

在它上面放一个计时器似乎不是正确的决定..谢谢!

2 个答案:

答案 0 :(得分:2)

  

“但是,我希望返回此数据,以便将其分配给视图中的变量。”

除了使AJAX请求同步(您可能不想要)之外,没有任何方法可以返回数据。

无论什么代码依赖于响应都需要从响应处理程序中调用。

由于可以传递函数,您可以让getTasks方法接收一个被调用的回调函数,并接收tasks数组。

  getTasks: function( callback ) // receive a callback function
    {
        var taskRequest = Titanium.Network.createHTTPClient();
        var api_url = 'http://myawesomeapi.heroku.com/users/' + Ti.App.Properties.getString("userID") + '/tasks';

        taskRequest.onload = function() {

            var tasks = [];

            // code populating the tasks array

            alert(tasks);

            callback( tasks ); // invoke the callback
        }

        taskRequest.open('GET', api_url, false);
        taskRequest.setRequestHeader('Content-Type', 'application/json');
        taskRequest.send();
    }

所以你要像这样使用它......

myObj.getTasks(function(tasks) {
    alert('in the callback');
    alert(tasks);
      // Any and all code that relies on the response must be
      //   placed (or invoked from) inside here
    some_other_function();
});

function some_other_function() {

    // Some more logic that can't run until the tasks have been received.
    // You could pass the tasks to this function if needed.

}

答案 1 :(得分:0)

您将变为空alert,因为执行底部警报时,服务器响应不可用且tasks数组为空。

当服务器响应到来时,任务数组由您在onload处理程序中的代码填充,以便您在第二个警报中看到任务。