2015-06-23 4 views
1

У меня есть куча функций с этой подписью:Запуск несколько асинхронных функций фильтра используется асинхронным

var plugins = [ 
    function f1(fileData, fileInfo, cb){ 
    /* Manipulate fileData */ 
    fileData += "f1 ran! "; 
    cb(null, fileData); 
    }, 

    function f2(fileData, fileInfo, cb){ 
    /* Manipulate fileData */ 
    fileData += "f2 ran! "; 
    cb(null, fileData); 
    } 
]; 

Я хочу, чтобы запустить все из них, в последовательности, и получить конечный результат.

На данный момент я использую async.waterfall:

var async = require('async'); 

var pluginsWithStarter = [ function(cb){ 
    return cb(null, fileData, fileInfo); 
} ].concat(plugins); 

var fileData = "Some example data"; 
var fileInfo = 

async.waterfall(pluginsWithStarter, function(err, fileData, fileInfo){ 
    if(err) return cb(err); 

    console.log("RESULT: "); 
    console.log(fileData); 
    console.log(fileInfo); 

    cb(null); 
}); 

Обратите внимание, что с помощью этой методики, плагины вынуждены вызвать обратный вызов с обоих аргументами: return cb(null, fileData, fileInfo);.

В принципе, я добавляю функцию «стартера» к водопаду, который будет работать с двумя начальными параметрами, которые будут обрабатываться всеми другими функциями и возвращаться.

Вопросы:

1) Является ли это хороший способ использовать async.waterfall? Я ожидал, что он сможет взять в себе первые параметры, например: async.waterfall(pluginsWithStarter, fileData, fileInfo, function(err, fileData, fileInfo){ Однако нет, у вас должна быть первая функция, которая не принимает никаких параметров, а затем возвращает обратный вызов с несколькими параметрами

2) Этот способ Я вынужден заставить каждую функцию возвращать значения BOTH, что немного уродливо. Как я могу изменить код, чтобы плагины могли только вызвать обратный вызов с одним параметром?

+0

Чтение этого меня очень радует, я переключился на использование обещаний (через [bluebird] (https://github.com/petkaantonov/bluebird)), особенно после понимание (благодаря [Нолану Лоусону] (http://pouchdb.com/2015/05/18/we-have-a-problem-with-promises.html)), что каждая функция в цепочке «.then» возвращает либо (1) обещание, (2) значение или (3) выдает ошибку. –

+0

Я рад, что ты рад. С другой стороны, я бы никогда не загрязнил серверный код обещаниями. – Merc

+0

[Почему?] (Http://giphy.com/embed/aUJTj93ZdvwRO) Я использую RethinkDB, а его драйвер узла поддерживает обратные вызовы или обещания - вы бы использовали обратные вызовы, или RethinkDB был бы слишком загрязнен для использования? –

ответ

0

Из async ticket on GitHub (я открыл его через три дня

1:. Да, это нормально способ использовать водопад - имеющий первую функцию простой функцией, которая устанавливает аргументы Другой вариант был бы чтобы сделать что-то вроде plugins[0] = plugins[0].bind(null, fileData, fileInfo); частично применить первую функцию

Я также рассматривает добавление acomb.constant к ASync, чтобы создать что первая функция проще:..

var pluginsWithStarter = [async.constant(fileData, fileInfo)].concat(plugins); 

OK

2: Я слышал, что вам нужно пройти все, хотя водопад. Вы можете поместить переменные в область закрытия родителя, чтобы не допустить, чтобы все это проходило через водопад. Вы также можете посмотреть в async.auto для управления многими переменными в рабочем процессе async. Его интерфейс немного странный, я соглашусь ...

Смежные вопросы