我想知道回调如何在angularJS中起作用。 我有这个代码完全像这样
$scope.loginFB = function () {
hello(FACEBOOK).login(function () {
hello(FACEBOOK).api('me').then(function (profile) {
console.log('successful api call');
dbService.handle_credentials(profile);
$rootScope.$apply(function () {
$location.path('/homePage');
});
}, function(){
console.error('something went wrong with authentification');
});
});
};
但在像这样重构时会以奇怪的方式工作
$scope.loginHandler =function () {
hello(FACEBOOK).api('me').then(function (profile) {
console.log('successful api call');
dbService.handle_credentials(profile);
$rootScope.$apply(function () {
$location.path('/homePage');
});
}, function(){
console.error('something went wrong with authentification');
});
};
$scope.loginFB = function () {
hello(FACEBOOK).login($scope.loginHandler());
};
请告诉我这次重构我做错了什么。
答案 0 :(得分:3)
通过包含params,您将立即调用函数回调而不是传递函数 reference ,这是您真正想要做的事情。
$scope.loginFB = function () {
hello(FACEBOOK).login($scope.loginHandler);
};
如果要将参数传递给回调函数,可以使用以下两种方法之一。
在匿名函数中包装回调
$scope.loginFB = function () {
hello(FACEBOOK).login(function() { return $scope.loginHandler(param); });
};
在现代浏览器中,使用.bind()
。
$scope.loginFB = function () {
hello(FACEBOOK).login($scope.loginHandler.bind(this, param)));
};