2013-11-07 12 views
1

У меня есть вызов Ajax, который извлекает некоторые JSON, ударяя мой контроллер:Можно ли инициализировать переменную с вызовом AJAX в CoffeeScript

class @Team 
    constructor:() -> 
    @players = null 
    @getTeamInfo() 

getTeamInfo:(teamId) -> 
    request = $.ajax 
    dataType: 'json', 
    type: 'GET' 
    url: "http://localhost:4000/teams/#{teamId}", 
    async: false 
    success : (data) => 
    _.each(data.players, (value) -> 
     name = _.pluck(value, 'name') 
     @players.push(new Player(name))) 

Проблема заключается в том, что мне нужно игроки с самого начала, и, видя, как JS работает асинхронно, переменные являются нулевыми. Есть ли способ, с помощью которого я могу инициализировать переменные с помощью ajax-вызова?

UPDATE: После того, как новый взгляд на вопрос с @mu_is_too_short и пониманием действительной важности обратных вызовов при выполнении Ajax звонков из @Rich Пека, я был в состоянии получить мою игру инициализации, гарантируя, что весь код, который зависит на данные, возвращенные из вызова Ajax, были включены в обратный вызов успеха Ajax. Я думаю, мне, возможно, придется включить все данные, которые мне понадобятся для создания игры, а не только данные команды и игрока. Но это позже. Спасибо, парни.

class @Game 

    constructor: (homeId, awayId) -> 
    @homeTeam = new Team() 
    @awayTeam = new Team() 
    @display = new GameDisplay() 
    @pitcher = new Pitching() 
    @contact = new Contact() 
    @baseRunners = new BaseRunners() 
    @gameEngine = new GameEngine(@homeTeam, @awayTeam, @display, @pitcher, @contact, @baseRunners) 
    @initializeHomeBattingOrder(1, 3) 

    pitch: -> 
    @gameEngine.makePitch() 

    initializeHomeBattingOrder: (homeId, awayId) -> 
    $.ajax 
     dataType: 'json', 
     type: 'GET', 
     url: "http://localhost:4000/teams/#{homeId}", 
     success : (data) => 
     @populateHomePlayers(data) 
     @initializeAwayBattingOrder(awayId) 

    initializeAwayBattingOrder: (awayId) -> 
    $.ajax 
     dataType: 'json', 
     type: 'GET', 
     url: "http://localhost:4000/teams/#{awayId}", 
     success : (data) => 
     @populateAwayPlayers(data) 
     @display.battingOrder(@awayTeam.players, @homeTeam.players) 
     @display.teamsPlaying(@awayTeam.name, @homeTeam.name) 

    populateHomePlayers: (data) -> 
    @homeTeam.players = _.map(_.pluck(data.players, "name"), (name) -> new Player(name)) 
    @homeTeam.name = data.name 

    populateAwayPlayers: (data) -> 
    @awayTeam.players = _.map(_.pluck(data.players, "name"), (name) -> new Player(name)) 
    @awayTeam.name = data.name 
+0

Это ваш реальный пробел или 'getTeamInfo' действительно отступ на тот же уровень, как' constructor'? И как только вы окажетесь на земле AJAX, вы в значительной степени застряли в обратном ад, если не ненавидите и не презираете своих пользователей, чтобы использовать синхронные вызовы. –

+0

@muistooshort мой пробел был отключен, извините, исправил его. Спасибо, что посмотрели.Как, черт возьми, я пробовал эту маленькую проблему около трех часов, я просто получаю данные в своих моделях (как JSON) в сторону JS, чтобы я мог инициализировать некоторые объекты. Я имею в виду, что у меня есть модель команды с игроками, я могу вернуть JSON в норму, но время от времени, несколько новое для JS-земли, обертывание моей головы вокруг асинхронного движения займет некоторое время, я посмотрел на тонну вещи в Интернете, но они предназначены для более «нормальных» операций в Интернете, я думаю, что инициализация игры нестандартная, извините за длинный комментарий –

+0

Это может сделать интересное чтение для вас: http://jfire.io/blog/ 2012/04/30/how-to-securely-bootstrap-json-in-a-rails-view/ –

ответ

4

Я собирался написать это как комментарий, но я решил, что будет легче читать в ответ. Я буду удалять, если неуместны, так как я не думаю, что я могу обеспечить прямое решение, а некоторые больше информации о работе с Ajax


Asychronous Javascript и XML

Ajax предназначен для запуска асинхронно по умолчанию, и фактически замораживает ваш браузер, если он вынужден работать синхронно (с помощью async: false)

мы нашли это тяжелый путь, как мы пытались найти способ, чтобы использовать его, чтобы назвать некоторые переменные & обнаруженные вами не может "просто использовать JAX»- вы должны разработать вокруг это


Использование обратных вызовов с помощью Ajax

Мы хотели, чтобы сделать форму„on the fly“, который необходимые данные, которые будут вызываться Ajax. Проблема заключалась в том, что вместо того, чтобы просто вставлять Ajax в выходящий код, нам пришлось реорганизовать его так, чтобы часть Ajax кода выполнялась независимо от «статических» частей. Мы исправили его using ajax callbacks

Вот наш код:

function create_modal(o){ 

       //o.ajax = the link to use. If present, it means we use Ajax :) 

      if(o.ajax){ 
      //Loading 

      fetch_modal(o.ajax, function(data){ 

       var modal = document.createElement("div"); 
       modal.setAttribute("id", o.modal_id.substring(1)); 
       modal.className = 'modal ajax'; 
       modal.innerHTML = data; 

       $("body").append(modal); 
       overlay(); 
       show_modal(o); 

      }, function(data){ 
       //error 
      }); 
     }else{ 
      overlay(); 
      show_modal(o); 
     } 
} 

function fetch_modal(link, success, error) { 
    $.ajax({ 
     url: link, 
     success: function(data) { success(data); }, 
     error: function(data) { error(data); } 
    }); 
} 

Вы можете увидеть демонстрацию этого работает на http://emailsystem.herokuapp.com (регистр & затем нажмите кнопку «Новый список»/«New Broadcast»/«Новый подписчик» кнопка) - эта форма оказывается через AJAX


CoffeeScript форматирования в сторону, я думаю, что лучшее, что вы можете сделать, это использовать функцию обратного вызова для Ajax, d делают Ajax центрального компонента в вашей функции, например:

class @Team 
    constructor:() -> 
    @players = null 
    @getTeamInfo(teamId, -> 

     _.each(data.players, (value) -> 
     name = _.pluck(value, 'name') 
     @players.push(new Player(name))) 
    , -> 
     //error 


getTeamInfo:(teamId, success, error) -> 
    request = $.ajax 
    dataType: 'json' 
    type: 'GET' 
    url: "teams/#{teamId}" 
    success : (data) => success(data) 
    error : (data) => error(data) 
Смежные вопросы