Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Coffeescript在第一个函数完成执行之前运行第二个函数_Coffeescript_Design Patterns - Fatal编程技术网

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

Coffeescript在第一个函数完成执行之前运行第二个函数,coffeescript,design-patterns,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()
中的代码在运行
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

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

您将异步命令视为同步命令。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回调:。

@Hiroto感谢语法提示。已经很晚了:)
configureMission
只是绑定了一个提交处理程序(每次调用时都会绑定一个新的处理程序)。所以它会运行,但在提交之前不会有任何可见的效果。我遗漏了什么?@muistooshort我使用.on代替.live(尚未测试),因为表单将在提交之前由DOM操纵??所需的功能是,点击事件与表单输入关联,用户输入“任务”的信息,当表单提交时,任务数据将在画布元素中设置动画,以绘制路线。我需要使用
mapSurface
函数中的
configureMission
函数中的jsonified数据,并且我需要“submit”事件来处理表单数据并将其显示在页面上。这有意义吗?问题是,
configureMission
对JSON没有任何作用,它只是绑定了一个提交,该提交将构建
MissionCommand
。顺序类似于
configureMission()
mapSurface()
,随着时间的推移,将调用提交处理程序。感谢您的输入。关于如何使用JSON有什么建议吗?为了给你一些上下文,我在rails应用程序的主干视图中使用它。我不需要传递它,我只想在窗体旁边的画布元素上生成一个图形。很好,这正是我所需要的。谢谢