2013-06-27 2 views
1

У меня есть два класса javascript (Controller.js & Events.js). Из Events.js я вызываю XML-парсер в Controller.js. Работы Parser, но ничего не возвращает:Возврат не возвращается Объект

SceneEvent.prototype.handleKeyDown = function (keyCode) { 
    switch (keyCode) { 
     case sf.key.ENTER: 
      var itemList = null;  
      itemList = Controller.ParseXML("app/data/Event.xml"); 
      alert("itemList = " + itemList); 
    } 
}; 

Controller.js выглядит следующим образом:

Controller.ParseXML = function (url) { 
    var itemList = null; 

    $.ajax({ 
     type: "GET", 
     url: url, 
     dataType: "xml", 
     async: false, 
     success: function(xml) { 
      $(xml).find("event").each(function() { 
       var _id = $(this).attr("id"); 
       var _eventItemDay = $(this).find("eventItemDay").text(); 
       ... 
       var _eventItemLocation = $(this).find("eventItemLocation").text(); 

       itemList = { 
        id: _id, 
        eventItemDay: _eventItemDay, 
        eventItemLocation: _eventItemLocation, 
        ... 
        eventItemLocation: _eventItemLocation 
       }; 
      }); 
      return itemList; 
     }, 
     error: function(xhr, ajaxOptions, thrownError){ 
      alert("XML ERROR"); 
      alert(xhr.status); 
      alert(thrownError); 
     } 
    }); 
}; 

Когда я распечатать ITEMLIST в Controller.js все работает отлично. Любые предложения?

+3

Я бы не предложил использовать synchronousJAX, но я думаю, вам нужно поставить 'return itemList;' в нижней части вашей основной функции, а не в 'success' – Ian

+0

: [Как вернуть ответ от AJAX позвонить?] (http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-ajax-call) –

ответ

2

Вы должны вернуть значение в конце функции ParseXML, а не в конце функции success.

Controller.ParseXML = function (url) { 
    var itemList = null; 

    $.ajax({ 
     type: "GET", 
     url: url, 
     dataType: "xml", 
     async: false, 
     success: function(xml) { 
      $(xml).find("event").each(function() { 
       var _id = $(this).attr("id"); 
       var _eventItemDay = $(this).find("eventItemDay").text(); 
       ... 
       var _eventItemLocation = $(this).find("eventItemLocation").text(); 

       itemList = { 
        id: _id, 
        eventItemDay: _eventItemDay, 
        eventItemLocation: _eventItemLocation, 
        ... 
        eventItemLocation: _eventItemLocation 
       }; 
      }); 

     }, 
     error: function(xhr, ajaxOptions, thrownError){ 
      alert("XML ERROR"); 
      alert(xhr.status); 
      alert(thrownError); 
     } 
    }); 

    return itemList; 
}; 
0

Вы можете рассмотреть вопрос о принятии вашего АЯКСА асинхра вызова и добавить функцию обратного вызова для вашей функции ParseXML. Что-то вроде этого в обработчике события:

itemList = Controller.ParseXML("app/data/Event.xml", function(itemList){ 
    alert("itemList = " + itemList); 
}); 

И в ParseXML:

Controller.ParseXML = function (url, callback) { 
var itemList = null; 

$.ajax({ 
    type: "GET", 
    url: url, 
    dataType: "xml", 
    async: true, 
    success: function(xml) { 
     $(xml).find("event").each(function() { 
      var _id = $(this).attr("id"); 
      var _eventItemDay = $(this).find("eventItemDay").text(); 
      ... 
      var _eventItemLocation = $(this).find("eventItemLocation").text(); 

      itemList = { 
       id: _id, 
       eventItemDay: _eventItemDay, 
       eventItemLocation: _eventItemLocation, 
       ... 
       eventItemLocation: _eventItemLocation 
      }; 
      callback(itemList); 
     }); 
    }, 
    error: function(xhr, ajaxOptions, thrownError){ 
     alert("XML ERROR"); 
     alert(xhr.status); 
     alert(thrownError); 
     callback("XML ERROR " + xhr.status + " " + thrownError); 
    } 
}); 

};

Вы должны будете проверить значение в обратном вызове для ошибок, конечно.

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