self = this
                  
                  
                          , hookArgs // arguments eventually passed to the hook - are mutable
                  
                  
                          , lastArg = arguments[arguments.length-1]
                  
                  
                          , pres = this._pres[name]
                  
                  
                          , posts = this._posts[name]
                  
                  
                          , _total = pres.length
                  
                  
                          , _current = -1
                  
                  
                          , _asyncsLeft = proto[name].numAsyncPres
                  
                  
                          , _asyncsDone = function(err) {
                  
                  
                              if (err) {
                  
                  
                                return handleError(err);
                  
                  
                              }
                  
                  
                              --_asyncsLeft || _done.apply(self, hookArgs);
                  
                  
                            }
                  
                  
                          , handleError = function(err) {
                  
                  
                              if ('function' == typeof lastArg)
                  
                  
                                return lastArg(err);
                  
                  
                  if (errorCb) return errorCb.call(self, err);
                  
                  
                              throw err;
                  
                  
                            }
                  
                  
                          , _next = function () {
                  
                  
                              if (arguments[0] instanceof Error) {
                  
                  
                                return handleError(arguments[0]);
                  
                  
                              }
                  
                  
                              var _args = Array.prototype.slice.call(arguments)
                  
                  
                                , currPre
                  
                  
                                , preArgs;
                  
                  
                              if (_args.length && !(arguments[0] == null && typeof lastArg === 'function'))
                  
                  
                                hookArgs = _args;
                  
                  
                              if (++_current < _total) {
                  
                  
                                currPre = pres[_current]
                  
                  
                                if (currPre.isAsync && currPre.length < 2)
                  
                  
                                  throw new Error("Your pre must have next and done arguments -- e.g., function (next, done, ...)");
                  
                  
                                if (currPre.length < 1)
                  
                  
                                  throw new Error("Your pre must have a next argument -- e.g., function (next, ...)");
                  
                  
                                preArgs = (currPre.isAsync
                  
                  
                                            ? [once(_next), once(_asyncsDone)]
                  
                  
                                            : [once(_next)]).concat(hookArgs);
                  
                  
                                try {
                  
                  
                                  return currPre.apply(self, preArgs);
                  
                  
                                } catch (error) {
                  
                  
                                  _next(error);
                  
                  
                                }
                  
                  
                              } else if (!_asyncsLeft) {
                  
                  
                                return _done.apply(self, hookArgs);
                  
                  
                              }
                  
                  
                            }
                  
                  
                          , _done = function () {
                  
                  
                              var args_ = Array.prototype.slice.call(arguments)
                  
                  
                                , ret, total_, current_, next_, done_, postArgs;
                  
                  
                  
                  
                  
                              if (_current === _total) {
                  
                  
                                
                  
                  
                                next_ = function () {
                  
                  
                                  if (arguments[0] instanceof Error) {
                  
                  
                                    return handleError(arguments[0]);
                  
                  
                                  }
                  
                  
                                  var args_ = Array.prototype.slice.call(arguments, 1)
                  
                  
                                    , currPost
                  
                  
                                    , postArgs;
                  
                  
                                  if (args_.length) hookArgs = args_;
                  
                  
                                  if (++current_ < total_) {
                  
                  
                                    currPost = posts[current_]
                  
                  
                                    if (currPost.length < 1)
                  
                  
                                      throw new Error("Your post must have a next argument -- e.g., function (next, ...)");
                  
                  
                                    postArgs = [once(next_)].concat(hookArgs);
                  
                  
                                    return currPost.apply(self, postArgs);
                  
                  
                                  } else if (typeof lastArg === 'function'){
                  
                  
                                    // All post handlers are done, call original callback function
                  
                  
                                    return lastArg.apply(self, arguments);
                  
                  
                                  }
                  
                  
                                };
                  
                  
                
Не делай так больше
это оригинальное форматирование?
Обсуждают сегодня