2

我的代码如下。我希望里面的代码在configureMission()运行之前完成运行mapSurface。这似乎没有发生。

missionCommands = "" # you don't have a mission yet
$('#startExploration').click -> # Set #missionControl as input for game configuration
    configureMission()
    mapSurface()        

configureMission =-> 
   $('#MissionControl').on "submit", ->
      # cool helper function shamelessly pinched from http://jsfiddle.net/sxGtM/3/
      $.fn.serializeObject = function() # not shown

      missionCommands = JSON.stringify($('form').serializeObject())
      return false #stops click event from firing

 mapSurface =->
    console.log('map')
    console.log(missionCommands)

我注意到,如果我再次提交表单,missionCommands变量已经用 json 数据更新,所以看起来表单数据已经被处理,但是这是在第二个函数运行之后发生的。

map login.js:60
   login.js:61
map login.js:60
{"xMaximum":"","yMaximum":"","xCoord":["iuoiuyi",""],"yCoord":["",""],"orientaiton":["",""]} login.js:61

mapSurface 我可以通过在函数内部移动函数来使其工作configureMission,但这似乎是一种不好的形式。我想知道,是否有更正确的模式可以用来实现我想要的将表单数据处理为 json、将其设置为变量并将变量传递给第二个函数的结果。

4

1 回答 1

1

您将异步命令视为同步命令。JavaScript(以及 CoffeeScript)异步工作,这意味着函数将并行运行。

mapSurface()您可以通过指定如下回调来解决此问题configureMission()

missionCommands = ""
$('#startExploration').click ->
    configureMission(mapSurface)

configureMission = (cb) -> 
   console.log "now running configureMission()"
   $('#MissionControl').on "submit", ->
      $.fn.serializeObject = function() # not shown

      missionCommands = JSON.stringify($('form').serializeObject())
      console.log "completed configureMission()"
      return cb()

mapSurface = ->
   console.log "now running mapSurface()"
   console.log missionCommands
   console.log "completed mapSurface()"

在此处了解 JavaScript 回调:http ://recurial.com/programming/understanding-callback-functions-in-javascript/ 。

于 2013-06-06T20:20:02.613 回答