Cod*_*Med 8 javascript angularjs
我正在研究AngularJS和REST.代码示例callback在身份验证功能中重复使用该单词. 回调是JavaScript或Angular中的关键字吗?或者callback只是在此代码中创建的自定义变量?如何callback在下面的代码中工作? 谷歌搜索callback和AngularJS没有产生可用的结果. 可以在此链接中读取有问题的AngularJS模块的代码,该链接还包含示例应用程序的所有代码.
这是模块代码本身:
angular.module('auth', []).factory( 'auth',
function($rootScope, $http, $location) {
enter = function() {
if ($location.path() != auth.loginPath) {
auth.path = $location.path();
if (!auth.authenticated) {
$location.path(auth.loginPath);
}
}
}
var auth = {
authenticated : false,
loginPath : '/login',
logoutPath : '/logout',
homePath : '/',
path : $location.path(),
authenticate : function(credentials, callback) {
var headers = credentials && credentials.username ? {
authorization : "Basic "
+ btoa(credentials.username + ":"
+ credentials.password)
} : {};
$http.get('user', {
headers : headers
}).success(function(data) {
if (data.name) {
auth.authenticated = true;
} else {
auth.authenticated = false;
}
callback && callback(auth.authenticated);
$location.path(auth.path==auth.loginPath ? auth.homePath : auth.path);
}).error(function() {
auth.authenticated = false;
callback && callback(false);
});
},
clear : function() {
$location.path(auth.loginPath);
auth.authenticated = false;
$http.post(auth.logoutPath, {}).success(function() {
console.log("Logout succeeded");
}).error(function(data) {
console.log("Logout failed");
});
},
init : function(homePath, loginPath, logoutPath) {
auth.homePath = homePath;
auth.loginPath = loginPath;
auth.logoutPath = logoutPath;
auth.authenticate({}, function(authenticated) {
if (authenticated) {
$location.path(auth.path);
}
})
// Guard route changes and switch to login page if unauthenticated
$rootScope.$on('$routeChangeStart', function() {
enter();
});
}
};
return auth;
});
Run Code Online (Sandbox Code Playgroud)
附加信息:
基于@ okonyk的响应,我包含来自调用auth.authenticate()函数的不同MODULE的代码:
$scope.login = function() {
auth.authenticate($scope.credentials, function(authenticated) {
if (authenticated) {
//do some stuff
$scope.error = false;
} else {
$scope.error = true;
}
})
}
Run Code Online (Sandbox Code Playgroud)
那么,如何从电话login()到auth.authenticate($scope.credentials, function(authenticated)工作?function(authenticated)参数是否发送了一个确定内部功能的布尔值auth.authenticate()?如果是这样,你能明确吗?我可以把它拼凑起来.例如,true可能表示执行回调,而false可能表示注释要执行回调,但这有助于解释它. 通过单击此链接,您可以使用该login()方法读取示例应用程序中其他模块的代码.
这里有很好的解释:
回调函数(也称为高阶函数)是一个函数,它被传递给另一个函数(让我们将另一个函数"otherFunction"调用)作为参数,并在otherFunction内调用(或执行)回调函数.回调函数本质上是一种模式(对常见问题的既定解决方案),因此,回调函数的使用也称为回调模式.
callback不是关键字,它只是传递给函数的参数名称,您可以随意调用它(callback或者cb很常见).
我将尝试在超简单的自定义构建回调函数的示例中解释它:
function useAsCallback(string){
console.log("callback is being executed with passed parameter: " + string)
}
function main(param, callback){
callback(param)
}
main(123456, useAsCallback)
Run Code Online (Sandbox Code Playgroud)
如果你运行它,它会打印:
callback is being executed with passed parameter: 123456
回调模式通常用于处理JavaScript异步行为.
编辑:更具体的例子:
谈论你的代码片段......假设你将工厂注入控制器.
现在你auth.authenticate暴露了方法.你必须传递两个参数(credentials, callback).
auth.authenticate({username: Joe, password: 123456}, function(authStatus){
if(authStatus){
console.log("Successfully authenticated")
}else{
console.log("Access denied")
}
});
Run Code Online (Sandbox Code Playgroud)
我们只是传递匿名函数作为callback我们auth.authenticate方法的参数.
编辑:回应'附加信息':
看起来可能存在一些误解.你在问:
函数(已验证)参数是否发送了一个确定auth.authenticate()内部功能的布尔值
事情就是这样,完全相反:auth.authenticate()将值传递给'function(authenticated)',这是一个匿名函数.它发生在这一点上:callback && callback(auth.authenticated);- 开.success或callback && callback(false);- 开.error
| 归档时间: |
|
| 查看次数: |
19968 次 |
| 最近记录: |