У меня есть вызов 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
Это ваш реальный пробел или 'getTeamInfo' действительно отступ на тот же уровень, как' constructor'? И как только вы окажетесь на земле AJAX, вы в значительной степени застряли в обратном ад, если не ненавидите и не презираете своих пользователей, чтобы использовать синхронные вызовы. –
@muistooshort мой пробел был отключен, извините, исправил его. Спасибо, что посмотрели.Как, черт возьми, я пробовал эту маленькую проблему около трех часов, я просто получаю данные в своих моделях (как JSON) в сторону JS, чтобы я мог инициализировать некоторые объекты. Я имею в виду, что у меня есть модель команды с игроками, я могу вернуть JSON в норму, но время от времени, несколько новое для JS-земли, обертывание моей головы вокруг асинхронного движения займет некоторое время, я посмотрел на тонну вещи в Интернете, но они предназначены для более «нормальных» операций в Интернете, я думаю, что инициализация игры нестандартная, извините за длинный комментарий –
Это может сделать интересное чтение для вас: http://jfire.io/blog/ 2012/04/30/how-to-securely-bootstrap-json-in-a-rails-view/ –