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