Показать сообщение отдельно
  #16 (permalink)  
Старый 13.05.2014, 08:58
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от dmitry111
обходит несколько функций, результат которых идет к следующей и так до конца. Но на деле то, как с этим работать?
везде, где есть асинхронные шаги в логике на практике чаще всего требовался parallel

зацени этот говнокод. рылся по истории git'а, чтобы специально показать тебе пример:

Задача: добавить категорию (родительскую\дочернюю - зависит от параметра запроса)

async.waterfall([

                    // тут получаем родительскую категорию, если можно
                    function (done) {
                        if (fields.id == -1) {
                            done(null, null);
                        } else {
                            models.ProductCategoryModel.findById(fields.id, function (err, parentCategory) { done(err, parentCategory); });
                        }
                    },

                    // тут определяем дочернюю категорию 
                    function (parentCategory, done) {
                        var newCategory;
                        if (parentCategory) {
                            newCategory = new models.ProductSubCategoryModel();
                        } else {
                            newCategory = new models.ProductCategoryModel();
                        }
                        newCategory.title = fields.new_category_name;
                        if (parentCategory) {
                            done(null, parentCategory, newCategory);
                        } else {
                            newCategory.save(function (err, newCategory) { done(err, parentCategory, newCategory); });
                        }
                    },

                    // связываем родительскую и дочернюю категории
                    function (parentCategory, childCategory, done) {
                        if (parentCategory) {
                            parentCategory.children.push(childCategory);
                            parentCategory.save(done);
                        } else {
                            done(null, null);
                        }
                    }

                ], function (err, parentCateg) {
                    if (err) return next(err);
                    allIsCompleted(err);
                });


Сообщение от dmitry111
вот я везде callback расставил, но это делает код менее понятным, ИМХО
вот для ухода от callback-hell используют async\Q\другое
Ответить с цитированием