通常在Javascript中我可以这样做:
var step;
determineStep();
function determineStep() {
step = 'A';
asyncCallbackA(function(result)) {
if (result.testForB) performB();
});
}
function performB() {
step = 'B';
asyncCallbackB(function(result)) {
if (result.testForC) performC();
});
}
function performC() {
step = 'C';
...
}
然而,Coffeescript不允许被提升的命名函数,因此我必须在调用它之前定义一个函数。这会导致它们出现故障(非常混乱)。如果它们中的任何一个具有循环依赖性,则根本不可能。
在Coffeescript中我被迫做了:
step = null
determineStep =
step = 'A'
asyncCallbackA (result) ->
if result.testForB
step = 'B'
asyncCallbackB (result) ->
if result.testForC
step = 'C'
asyncCallbackC (result) ->
...
determineStep()
如果您有多个步骤,这很快就会失控。
是否可以在Cofffeescript中实现Javascript模式?如果没有,处理这种情况的最佳方法是什么?
答案 0 :(得分:2)
我觉得你有点困惑。当你说:
f = -> ...
var f
(当然)被提升到范围的顶部,但f = function() { ... }
定义保留在原来的位置。这意味着唯一重要的顺序是您需要在determineStep()
之前定义所有函数。
f = -> g()
g = -> h()
h = -> console.log('h')
f()
在你的情况下:
step = null
determineStep = ->
step = 'A'
asyncCallbackA (result) -> performB() if(result.testForB)
performB = ->
step = 'B'
asyncCallbackB (result) -> performC() if(result.testForC)
performC = ->
step = 'C'
...
determineStep()
应该没问题。 determineStep
performB
可以在定义performB
之前调用var performB
,因为:
determineStep
已悬挂。performB = function() { ... }
执行时,{{1}}将会完成。与其他功能类似,因此您不必担心功能之间的相互依赖性。