Как я могу развернуть обратные вызовы в Coffeescript?

Обычно в 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()

Если у вас есть несколько шагов, это может быстро выйти из-под контроля.

Можно ли реализовать шаблон Javascript в Cofffeescript? Если нет, то как лучше всего справиться с этим сценарием?

1 ответ

Решение

Я думаю, что вы немного смущены. Когда ты сказал:

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 определяется (в исходном порядке), потому что:

  1. var performB поднят.
  2. Тем временем determineStep выполняет, performB = function() { ... } будет сделано.

Аналогично для других функций, поэтому вам не нужно беспокоиться о взаимозависимостях между вашими функциями.

Другие вопросы по тегам