Javascript 是否可以在Coffeescript中使用AJAX调用初始化变量

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

我有一个ajax调用,通过点击我的控制器获取一些JSON:

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那篇文章很有趣。这是不同的