2012-03-16 9 views
0

Это модуль в приложении для iPhone. Цель состоит в том, чтобы вернуть массив из JONON responeText, который затем можно добавить к свойству data TableView в другом модуле.Передать результат функции 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; 

EDIT: Решение было найдено в конце концов, здесь 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

Я играл с обратными вызовами, но не могу заставить его работать. Мои событияCallback, похоже, не запускаются, так как theres нет вывода из info(). Модуль окна: http://pastebin.com/1kdga075 Модуль данных: http://pastebin.com/bQVi55Pn –

+0

Если обратный вызов onload не запускается, тогда должна быть ошибка. Попробуйте добавить info() в обратный вызов onerror и посмотреть, запускается ли это. – DannyM

+0

xhr.onload в Events() действительно срабатывает, так как я получаю вывод из функции info(), я имел в виду eventsCallback() в EventsWindow. Извини за это. Я добавил «xhr.onerror = function (e) {Ti.API.info (e.error);}» в Events(), и в консоли нет ошибки. –

0

AJAX является асинхронным, функция onload работает, когда вызов AJAX делается. Значение JavaScript продолжается с вашей функцией, а затем запускается onload. Это означает, что вы не можете вернуть значение из него.

Вам необходимо поместить весь код, относящийся к переменной rows (или self) внутри функции onload.

Смежные вопросы