У меня есть куча функций с этой подписью:Запуск несколько асинхронных функций фильтра используется асинхронным
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, что немного уродливо. Как я могу изменить код, чтобы плагины могли только вызвать обратный вызов с одним параметром?
Чтение этого меня очень радует, я переключился на использование обещаний (через [bluebird] (https://github.com/petkaantonov/bluebird)), особенно после понимание (благодаря [Нолану Лоусону] (http://pouchdb.com/2015/05/18/we-have-a-problem-with-promises.html)), что каждая функция в цепочке «.then» возвращает либо (1) обещание, (2) значение или (3) выдает ошибку. –
Я рад, что ты рад. С другой стороны, я бы никогда не загрязнил серверный код обещаниями. – Merc
[Почему?] (Http://giphy.com/embed/aUJTj93ZdvwRO) Я использую RethinkDB, а его драйвер узла поддерживает обратные вызовы или обещания - вы бы использовали обратные вызовы, или RethinkDB был бы слишком загрязнен для использования? –