Coffeescript在第一个函数执行完之前运行第二个函数

时间:2013-05-18 01:30:02

标签: coffeescript design-patterns

我的代码如下。我希望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所需的结果,将其设置为变量并将变量传递给第二个函数。

1 个答案:

答案 0 :(得分: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/