2014-11-26 2 views
0

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

async.waterfall([ 
    async.apply(osxAppIconName, options.appFile), 
    function(iconFileName, callback) { 
    var existingIcon = path.join(options.iconDirectory, iconFileName); 
    return callback(null, existingIcon); 
    }, 
    async.apply(fs.copy, options.iconFile), //automatically puts in existingIcon 
    async.apply(osxAppIconTouch, options.appFile), 
], callback); 

Прямо сейчас я использую async.apply, который будет вводить глобальные аргументы функции. В этом случае выше я хороший, он принимает existingIcon и добавит его как второй-последний аргумент в fs.copy. Составление fs.copy аргументов options.iconfile, exitingIcon, обратный вызов [function]. Это здорово!

Однако предположим, что мне нужно выйти из Интернета позже. Скажем, я нажимаю это в свой массив функций водопада.

async.apply(newFunction, existingIcon) 

Как бы получить existingIcon этой функцией? Глобал? Кажется, головная боль управляется! Я также думаю, что функция async.apply выполняется при загрузке, поэтому, если я передам ей переменную, она будет использовать значение переменной при выполнении async.apply.

Мысли? У меня есть предложение для async.switchboardhere. Какие попытки решить это, но это не сработает.

+0

Верстка всегда работает. – Bergi

+0

@ Bergi Ты меня троллировал? – ThomasReggi

+0

Я не хотел, нет. Но всякий раз, когда вам нужны переменные несколько раз (т. Е. Не прямой водопад), тогда вложенные обратные вызовы - это тривиальное решение, которое работает хорошо (намного лучше, чем пытаться использовать глобальные переменные) и обычно это путь. – Bergi

ответ

0

Это отличный способ обойти это, используя async.auto, который прикрепляет результат функции к опоре в цепи.

return async.auto({ 
    "icon_name": async.apply(osxAppIconName, options.appFile), 
    "copy_icon": ["icon_name", 
    function(callback, results) { 
     results.existing_icon = path.join(options.iconDirectory, results.icon_name); 
     return fs.copy(options.iconFile, results.existing_icon, callback); 
    } 
    ], 
    "touch_icon": ["copy_icon", async.apply(osxAppIconTouch, options.appFile)], 
}, callback); 

Для обещания проверить: