Javascript 如何在http请求的错误和成功回调之间共享变量
我想在angular js的$http.get请求这两个方法之间共享一个变量 我的代码如下所示Javascript 如何在http请求的错误和成功回调之间共享变量,javascript,angularjs,angularjs-directive,angular-promise,Javascript,Angularjs,Angularjs Directive,Angular Promise,我想在angular js的$http.get请求这两个方法之间共享一个变量 我的代码如下所示 app.run(function($rootScope,$http) { $rootScope.checkSession = function(){ window.a = false; $http.get('/data/url') .success(function(response) { window.a = true; }) .error(funct
app.run(function($rootScope,$http) {
$rootScope.checkSession = function(){
window.a = false;
$http.get('/data/url')
.success(function(response) {
window.a = true;
})
.error(function(response){
window.a = false;
});
return window.a;
};
});
app.controller('profileController', function($scope, $rootScope) {
alert($rootScope.checkSession());
});
我的控制器代码如下所示
app.run(function($rootScope,$http) {
$rootScope.checkSession = function(){
window.a = false;
$http.get('/data/url')
.success(function(response) {
window.a = true;
})
.error(function(response){
window.a = false;
});
return window.a;
};
});
app.controller('profileController', function($scope, $rootScope) {
alert($rootScope.checkSession());
});
输出总是false,而如果我在两个函数中都使用alert response,它就会正常工作。您混淆了返回和承诺。在您的承诺($http.get)解析时,window.a将被设置为异步,到那时,带有初始值的返回已经被alert()返回并使用。您混淆了返回和承诺。在您的承诺($http.get)解析时,window.a将被设置为异步,到那时,您返回的初始值已被alert()返回并使用。您的做法不是处理异步调用的正确方法,根据当前实现,它将始终从该
checkSession
方法返回false
。您需要从异步处理的方法返回promise
。该承诺将从其解析
和拒绝
返回数据
另外一件事是,我希望将此代码放在工厂中,而不是放在$rootScope
中
工厂
app.factory('sessionFactory', function($http) {
var sessionFactory = {}
sessionFactory.checkSession = function(){
return $http.get('/data/url')
.then(function(response) {
return true;
},(function(response){
return false;
});
};
return sessionFactory;
});
因此,要在控制器中使用它,首先需要在控制器工厂函数中注入sessionFactory
,然后在其上使用checkSession
方法。然后,您将返回该方法的数据
控制器
app.controller('profileController', function($scope, sessionFactory) {
sessionFactory.checkSession().then(function(data){
alert(data);
});
});
您的做法不是处理异步调用的正确方法,根据当前的实现,它将始终从该
checkSession
方法返回false
。您需要从异步处理的方法返回promise
。该承诺将从其解析
和拒绝
返回数据
另外一件事是,我希望将此代码放在工厂中,而不是放在$rootScope
中
工厂
app.factory('sessionFactory', function($http) {
var sessionFactory = {}
sessionFactory.checkSession = function(){
return $http.get('/data/url')
.then(function(response) {
return true;
},(function(response){
return false;
});
};
return sessionFactory;
});
因此,要在控制器中使用它,首先需要在控制器工厂函数中注入sessionFactory
,然后在其上使用checkSession
方法。然后,您将返回该方法的数据
控制器
app.controller('profileController', function($scope, sessionFactory) {
sessionFactory.checkSession().then(function(data){
alert(data);
});
});
很好的例子,请注意alert()可能无法正确使用promise。@Maarten查看edit..实际上我正在将其转换为factory..要使用
checkSession
方法而不是污染$rootScope
@VivekMaru,请查看更新后的版本,其中有更好的解释。。。很高兴能帮助你……)很好的例子,请注意alert()可能无法正确使用promise。@Maarten查看edit..实际上我正在将其转换为factory..要使用checkSession
方法而不是污染$rootScope
@VivekMaru,请查看更新后的版本,其中有更好的解释。。。很高兴能帮助你……)在成功或错误出现之前返回。。这是错误的接近窗口。在成功或错误出现之前返回。。这是错误的做法