Javascript 如何在http请求的错误和成功回调之间共享变量

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

我想在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(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,请查看更新后的版本,其中有更好的解释。。。很高兴能帮助你……)在成功或错误出现之前返回。。这是错误的接近窗口。在成功或错误出现之前返回。。这是错误的做法