return _.reduce(providers, function(last, provider) { var authenticate = _.bind(provider.authenticate, provider, credentials), success = _.partial(successHandler, provider), failure = _.partial(errorHandler, provider); return last.catch(function(reason) { try { return Q(authenticate()).then(success, failure); } catch(e) { return failure(e); } }); }, Q.reject());
/* * @method loginRequired * Проверяет залогинен ли пользователь и вызывает действие логина если требуется * @param {Mixed} nextAction Действие выполняемое после удачного логина. По умолчанию открывает вид `index`. * Функция или массив вида ['viewName', argsObject] или 'имя вида'. * @param {Mixed} loginAction Действие выполняемое если пользователь не аутентифицирован. По умолчанию открывает вид `logon`, если он существует. * Функция или массив вида ['viewName', argsObject] или 'имя вида'. * @param {Object} context Контекст в котором будут вызваны функции. * @return {Boolean} Истина если потребовался вход. */ function loginRequired(nextAction, loginAction, context) { if(currentUser.isAuthenticated()) return false; nextAction = nextAction || config.nextAction; loginAction = loginAction || config.loginAction; function openView(params) { var args, name; if(_.isArray(params) && params.length) { name = params[0]; args = params.length > 1 && params[1]; } else if(_.isString(params)) { name = params; } Alloy.createController(name, args).getView().open(); } // build next action callback if(_.isFunction(nextAction)) { context && (nextAction = _.bind(nextAction, context)); } else { nextAction = _.partial(openView, nextAction); } // build login action callback if(_.isFunction(loginAction)) { loginAction = _.bind(loginAction, context || null, nextAction); } else { if(_.isString(loginAction)) { loginAction = [loginAction, {next: nextAction}]; } else if(_.isArray(loginAction)) { loginAction[1] = _.extend({next: nextAction}, loginAction[1]); } loginAction = _.partial(openView, loginAction); } Ti.API.info(MODULE_NAME,'Redirect to login action'); loginAction(); return true; };