Каков наилучший модуль потока управления для node.js?
Я использовал caolan async module, который очень хорош, однако ошибки отслеживания и различный способ передачи данных для управления потоком вызывает развитие иногда бывает очень сложно.
Я хотел бы знать, есть ли какие-либо лучшие варианты или то, что в настоящее время используется в производственных средах.
Спасибо за чтение.
Ответы
Ответ 1
Я использую async. Чтобы помочь отслеживать ошибки, рекомендуется использовать функции, вместо того, чтобы загружать анонимные функции:
async.series([
function doSomething() {...},
function doSomethingElse() {...},
function finish() {...}
]);
Таким образом вы получите более полезную информацию в трассировке стека.
Ответ 2
... однако ошибки отслеживания и различный способ передачи данных для управляющего потока заставляют разработку иногда быть очень сложной.
Недавно я создал простую абстракцию с именем "wait.for" для вызова асинхронных функций в режиме синхронизации (на основе Fibers): https://github.com/luciotato/waitfor
Используя wait.for, вы можете использовать "try/catch" при одновременном вызове async-функций, и вы сохраняете функциональную область (без необходимости закрытия). Пример:
function inAFiber(param){
try{
var data= wait.for(fs.readFile,'someFile'); //async function
var result = wait.for(doSomethingElse,data,param); //another async function
otherFunction(result);
}
catch(e) {
//here you catch if some of the "waited.for"
// async functions returned "err" in callback
// or if otherFunction throws
};
см. примеры в https://github.com/luciotato/waitfor
Ответ 3
Иногда трудно помещать все функции в массив. Когда у вас есть массив объектов и вы хотите что-то сделать для каждого объекта, я использую что-то вроде приведенного ниже примера.
подробнее в: http://coppieters.blogspot.be/2013/03/iterator-for-async-nodejs-operations.html
var list = [1, 2, 3, 4, 5];
var sum = 0;
Application.each(list, function forEachNumber(done) {
sum += this;
// next statement most often called as callback in an async operation
// file, network or database stuff
done(); // pass an error if something went wrong and automatically end here
}, function whenDone(err) {
if (err)
console.log("error: " + err);
else
console.log("sum = " + sum);
});
Я называю функции, потому что легче отлаживать (и читать легче)