В предыдущем посте я показал пару приемов применения модуля async на простом примере. Сегодня этот пост мне показался незавершенным, тема не до конца раскрытой, код недописанным, Callback Hell недолеченным, в общем спешу поделиться более убедительным по моему мнению решением рассмотренного вопроса.
Приведенный ниже код говорит сам за себя - теперь все так разложено по полочкам, что по-моему не разобраться что к чему крайне затруднительно. Комменты в помощь:
Результат:
Все, теперь точно тру, не правда ли?
Приведенный ниже код говорит сам за себя - теперь все так разложено по полочкам, что по-моему не разобраться что к чему крайне затруднительно. Комменты в помощь:
var async = require('async');
getData(function(data) { // получаем данные, асинхронно
async.waterfall([
async.apply(step1, data), // шаг №1 - сложение и умножение
async.apply(step2, data), // шаг №2 - вычитание
], function(err) {
if (err) console.log('err:', err.message);
console.log('data:', data);
});
});
function step1(data, cb) {
async.each(data, function(obj, next) { // асинхронно для каждого полученного объекта
async.parallel([ // одновременно выполняем сложение и умножение
async.apply(add, obj),
async.apply(multiply, obj)
], next);
}, cb);
}
function step2(data, cb) {
async.each(data, function(obj, next) { // асинхронно для каждого полученного объекта
subtract(obj, next); // выполняем вычитание
}, cb);
}
function getData(cb) {
setTimeout(function() {
console.log('Getting data...');
return cb([{a: 3}, {a: 5}]);
}, 1000);
}
function add(obj, cb) {
setTimeout(function() {
// if (obj.a === 3) return cb(new Error('Achtung!'));
obj.b = obj.a + obj.a;
console.log('%d plus %d = %d', obj.a, obj.a, obj.b);
cb();
}, 1000);
}
function multiply(obj, cb) {
setTimeout(function() {
obj.c = obj.a * obj.a;
console.log('%d times %d = %d', obj.a, obj.a, obj.c);
cb();
}, 1000);
}
function subtract(obj, cb) {
setTimeout(function() {
obj.d = obj.c - obj.b;
console.log('%d minus %d = %d', obj.c, obj.b, obj.d);
cb();
}, 1000);
}
Результат:
Все, теперь точно тру, не правда ли?


Комментариев нет:
Отправить комментарий
Комментарий будет опубликован после модерации