2012-03-16 20 views
0

这是我iPhone应用程序中的一个模块。它的目的是从JSON responeText返回一个数组,然后可以将它添加到另一个模块中的TableView的data属性中。将onload函数的结果传递给变量

对于JavaScript来说相对陌生,我无法找到正确的语法将我的数组传递给变量self。

function Events() { 
var self = []; 

var xhr = Ti.Network.createHTTPClient(); 
xhr.open('GET', 'http://localhost/ngparser/events.php'); 

xhr.onload = function() { 
    var events = JSON.parse(this.responseText), 
     rows = []; 

    Ti.API.info('JSON responseText: '); 
    Ti.API.info(events); 

    for (var i in events) { 
     var id = events[i].id, 
      title = events[i].title;    

     var amp = title.search('&'); 
     if (amp != -1) { 
      title = title.replace('&', '&'); 
     } 

     var row = Ti.UI.createTableViewRow({ 
      title: title, 
      hasChild: true 
     }); 
     rows.push(row);   
    } 

    // I want this... 
    return rows;   
}; 

xhr.send(); 
self = //... to end up here! 
self = xhr.send(); //Does not work 
return self; 
} 

module.exports = Events; 

编辑:溶液最终在这里http://developer.appcelerator.com/question/133913/how-do-i-pass-result-from-xhronload-function-to-variable#comment-119031

回答

2

xhr.onload函数异步运行,不会返回一个值,因此返回行变量是无用的。

你可以做的是使用回调函数内的表视图的setData方法将行数组添加到tableview。

function Events() { 
var self = []; 

var xhr = Ti.Network.createHTTPClient(); 
xhr.open('GET', 'http://localhost/ngparser/events.php'); 

xhr.onload = function() { 
    var events = JSON.parse(this.responseText), 
     rows = []; 

    Ti.API.info('JSON responseText: '); 
    Ti.API.info(events); 

    for (var i in events) { 
     var id = events[i].id, 
      title = events[i].title;    

     var amp = title.search('&'); 
     if (amp != -1) { 
      title = title.replace('&', '&'); 
     } 

     var row = Ti.UI.createTableViewRow({ 
      title: title, 
      hasChild: true 
     }); 
     rows.push(row);   
    } 
    tableView.setData(rows); 

}; 

xhr.send(); 
} 
+0

我一直在玩回调,但无法得到它的工作。我的eventsCallback似乎没有运行,因为这些信息()没有输出。窗口模块:http://pastebin.com/1kdga075数据模块:http://pastebin.com/bQVi55Pn – 2012-03-16 17:45:55

+0

如果onload回调没有触发,那么必须有错误。尝试在onerror回调中添加一个info(),并查看是否触发。 – DannyM 2012-03-16 18:09:27

+0

事件()中的xhr.onload确实触发了,因为我在函数中从info()获得输出,我的意思是EventsWindow中的eventsCallback()。对于那个很抱歉。我在Events()中添加了“xhr.onerror = function(e){Ti.API.info(e.error);}”,并且控制台中没有错误。 – 2012-03-16 18:31:23

0

发现AJAX是异步的,当AJAX调用完成的onload函数运行。 JavaScript的含义继续与您的功能,并在稍后运行onload。这意味着你不能从它返回一个值。

您需要将与rows(或self)变量相关的所有代码放在onload函数中。