Как я могу развернуть обратные вызовы в 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
определяется (в исходном порядке), потому что:
var performB
поднят.- Тем временем
determineStep
выполняет,performB = function() { ... }
будет сделано.
Аналогично для других функций, поэтому вам не нужно беспокоиться о взаимозависимостях между вашими функциями.