Javascript 是否可以在Coffeescript中使用AJAX调用初始化变量
我有一个ajax调用,通过点击我的控制器获取一些JSON:Javascript 是否可以在Coffeescript中使用AJAX调用初始化变量,javascript,jquery,ruby-on-rails,ajax,coffeescript,Javascript,Jquery,Ruby On Rails,Ajax,Coffeescript,我有一个ajax调用,通过点击我的控制器获取一些JSON: class @Team constructor: () -> @players = null @getTeamInfo() getTeamInfo:(teamId) -> request = $.ajax dataType: 'json', type: 'GET' url: "http://localhost:4000/teams/#{teamId}", async: false
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调用实际初始化变量
更新:
从@mu_is_too_short获得了关于这个问题的新观点,并且理解了从@Rich Peck执行ajax调用时回调的真正重要性,通过确保所有依赖于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
我本打算写这篇文章作为评论,但我想在回答中读起来会更容易。如果不合适,我将删除,因为我不认为我可以提供直接的解决方案,而是关于使用Ajax的更多信息
异步Javascript和XML 默认情况下,Ajax设计为异步运行,如果强制同步运行,实际上会冻结浏览器(通过使用
async:false
)
我们很难发现这一点,因为我们试图找到一种使用它来调用一些变量的方法&发现你不能“仅仅使用ajax”——你必须围绕它进行设计
使用Ajax回调 我们希望呈现一个表单“”,它需要Ajax调用数据。问题在于,我们必须重构Ajax,使代码中的Ajax部分独立于“静态”部分运行,而不仅仅是将Ajax安装到现有代码中。我们用一根绳子把它修好了 这是我们的代码:
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); }
});
}
您可以在(注册并单击“新建列表”/“新建广播”/“新建订阅者”按钮)上看到此操作的演示——该表单通过ajax呈现
除了CoffeeScript格式之外,我认为您可以做的最好的事情是为Ajax使用回调函数,并使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)
我本打算写这篇文章作为评论,但我想在回答中读起来会更容易。如果不合适,我将删除,因为我不认为我可以提供直接的解决方案,而是关于使用Ajax的更多信息
异步Javascript和XML 默认情况下,Ajax设计为异步运行,如果强制同步运行,实际上会冻结浏览器(通过使用
async:false
)
我们很难发现这一点,因为我们试图找到一种使用它来调用一些变量的方法&发现你不能“仅仅使用ajax”——你必须围绕它进行设计
使用Ajax回调 我们希望呈现一个表单“”,它需要Ajax调用数据。问题在于,我们必须重构Ajax,使代码中的Ajax部分独立于“静态”部分运行,而不仅仅是将Ajax安装到现有代码中。我们用一根绳子把它修好了 这是我们的代码:
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); }
});
}
您可以在(注册并单击“新建列表”/“新建广播”/“新建订阅者”按钮)上看到此操作的演示——该表单通过ajax呈现
除了CoffeeScript格式之外,我认为您可以做的最好的事情是为Ajax使用回调函数,并使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)
这是您真正的空白还是
getTeamInfo
真的缩进到了与constructor
相同的级别?一旦你进入AJAX领域,你就会陷入回调的地狱,除非你憎恨和鄙视你的用户,以至于使用同步调用。@muistooshort我的空格被关闭了,抱歉,修复了它。谢谢你的关注。我是怎么把模型中的数据(JSON)放到JS端的(我已经花了大约三个小时讨论这个小问题),这样我就可以初始化一些对象了。我的意思是,我有一个团队模型和玩家,我可以把JSON拿回来,但是时间不早了,对JS来说有点陌生,围绕异步需要一段时间,我在web上看过很多东西,但它们是为了更“正常”的web开发操作,我想初始化游戏是非标准的,抱歉评论太长了这可能会让你读起来很有趣:@muistooshort那篇文章很有趣。这是一种不同于我预期的方法,将JSON直接嵌入到页面中。我正在使用HAML模板进行渲染,我需要类似于js.erb视图的东西吗?这是引导数据的一种非常标准的方法,您确实希望引导启动所需的一切。我不知道HAML,但大概它可以生成window.bootstrap\u data=some\u blob\u\u-mangled\u-json
。然后确保您的代码被包装在一个$->
文档准备包装器中,并在需要时抓取窗口。引导数据
。这是您真正的空白还是getTeamInfo
与构造函数的缩进级别相同?一旦你进入AJAX领域,你就会陷入回调的地狱,除非你憎恨和鄙视你的用户,以至于使用同步调用。@muistooshort我的空格被关闭了,抱歉,修复了它。谢谢你的关注。我是怎么把模型中的数据(JSON)放到JS端的(我已经花了大约三个小时讨论这个小问题),这样我就可以初始化一些对象了。我的意思是,我有一个团队模型和玩家,我可以把JSON拿回来,但是时间不早了,对JS来说有点陌生,围绕异步需要一段时间,我在web上看过很多东西,但它们是为了更“正常”的web开发操作,我想初始化游戏是非标准的,抱歉评论太长了这可能会让你读起来很有趣:@muistooshort那篇文章很有趣。这是不同的