如何在Coffeescript中展开回调?

时间:2014-09-02 21:05:07

标签: callback coffeescript nested unroll

通常在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模式?如果没有,处理这种情况的最佳方法是什么?

1 个答案:

答案 0 :(得分:2)

我觉得你有点困惑。当你说:

f = -> ...

var f(当然)被提升到范围的顶部,但f = function() { ... }定义保留在原来的位置。这意味着唯一重要的顺序是您需要在determineStep()之前定义所有函数。

例如,this works just fine

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,因为:

  1. determineStep已悬挂。
  2. performB = function() { ... }执行时,{{1}}将会完成。
  3. 与其他功能类似,因此您不必担心功能之间的相互依赖性。