Javascript 钛合金HTTPClient也返回';快速';

Javascript 钛合金HTTPClient也返回';快速';,javascript,httpclient,titanium,return,appcelerator,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 = []; tas

我有以下功能:

  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;
    }
gettask:function()
{
var taskRequest=Titanium.Network.createHTTPClient();
var api_url='1〕http://myawesomeapi.heroku.com/users/“+Ti.App.Properties.getString(“userID”)+”/tasks”;
var任务=[];
taskRequest.onload=函数(){
var response=JSON.parse(this.responseText),
len=响应长度,
i=0,
T
对于(;i
此功能在我的控制器中;当我需要加载数据时,我在视图中调用它。但是,我希望
返回此数据,以便将其分配给视图中的变量

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

现在我的一个明显的问题是,如何让函数返回包含数据的数组,而不是不包含数据

设置计时器似乎不是正确的决定。。谢谢

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

除了使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.

}

您得到的是空的
警报
,因为当执行底部警报时,服务器响应不可用,并且
任务
数组为空


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

我知道。有没有办法让它等待,或者让它返回我想要的数据/我认为钛不再支持同步请求。也许这个链接会对你有所帮助。嘿,谢谢你的回复和示例代码。我现在试过了,它可以与警报一起工作;然而,我想当我把它赋给一个变量时,我又遇到了同样的问题。我这样做:
var data=this.controller.getTasks(函数(任务){alert(任务);return(任务);});警报(数据)
但警报似乎在收到数据之前出现,因此它再次返回空。我需要再次回电话吗;D@cabaret:否,您将无法返回该值。
gettask
函数将在收到响应之前很久返回。您需要做的是将依赖于响应的任何代码放入要传递给
gettask
的回调函数中。如果代码太多,你可以将其他代码分解成单独的函数,只要这些函数是从回调中调用的。哦,好的。我现在明白了!代码不多,所以应该没问题。非常感谢你的帮助!