0

通常在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()

如果您有多个步骤,这可能很快就会失控。

是否可以在 Coffeescript 中实现 Javascript 模式?如果没有,处理这种情况的最佳方法是什么?

4

1 回答 1

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()

应该没事。determineStepcan call performBbeforeperformB被定义(按源顺序),因为:

  1. var performB吊起。
  2. 到时候determineStep执行,performB = function() { ... }遗嘱已经完成。

对于其他函数也是如此,因此您不必担心函数之间的相互依赖关系。

于 2014-09-02T22:08:58.827 回答