Javascript 如何使用$q从AngularJS服务返回已解决的承诺?

Javascript 如何使用$q从AngularJS服务返回已解决的承诺?,javascript,angularjs,promise,angular-promise,Javascript,Angularjs,Promise,Angular Promise,我的服务是: myApp.service('userService', [ '$http', '$q', '$rootScope', '$location', function($http, $q, $rootScope, $location) { var deferred; deferred = $q.defer(); this.initialized = deferred.promise; this.user = { access: false

我的服务是:

myApp.service('userService', [
  '$http', '$q', '$rootScope', '$location', function($http, $q, $rootScope, $location) {
    var deferred;
    deferred = $q.defer();
    this.initialized = deferred.promise;
    this.user = {
      access: false
    };
    this.isAuthenticated = function() {
      this.user = {
        first_name: 'First',
        last_name: 'Last',
        email: 'email@address.com',
        access: 'institution'
      };
      return deferred.resolve();
    };
  }
]);
我通过以下方式在我的
config
文件中调用此函数:

myApp.run([
  '$rootScope', 'userService', function($rootScope, userService) {
    return userService.isAuthenticated().then(function(response) {
      if (response.data.user) {
        return $rootScope.$broadcast('login', response.data);
      } else {
        return userService.logout();
      }
    });
  }
]);

但是,它抱怨
然后
不是一个函数。我不是在退回已决定的承诺吗?

退回你的承诺,延期退回。承诺。
promise API具有“then”方法

调用resolve不会返回承诺,它只会向 承诺该承诺已解决,因此它可以执行“then”逻辑

基本模式如下,冲洗并重复


测试
var-app=angular.module(“app”,[]);
应用控制器(“测试”,功能($scope,$q){
$scope.$test=函数(){
var deferred=$q.deferred();
延期。决议(“Hi”);
回报。承诺;
};
$scope.test=函数(){
$scope.$test()
.then(功能(数据){
控制台日志(数据);
});
}      
});
引导(文档,[“应用程序]);

从您的服务方法:

function serviceMethod() {
    return $timeout(function() {
        return {
            property: 'value'
        };
    }, 1000);
}
在控制器中:

serviceName
    .serviceMethod()
    .then(function(data){
        //handle the success condition here
        var x = data.property
    });
试试这个:

myApp.service('userService', [
    '$http', '$q', '$rootScope', '$location', function($http, $q, $rootScope, $location) {
      var deferred= $q.defer();
      this.user = {
        access: false
      };
      try
      {
      this.isAuthenticated = function() {
        this.user = {
          first_name: 'First',
          last_name: 'Last',
          email: 'email@address.com',
          access: 'institution'
        };
        deferred.resolve();
      };
    }
    catch
    {
        deferred.reject();
    }

    return deferred.promise;
  ]);

以下是您服务的正确代码:

myApp.service('userService', [
  '$http', '$q', '$rootScope', '$location', function($http, $q, $rootScope, $location) {

    var user = {
      access: false
    };

    var me = this;

    this.initialized = false;
    this.isAuthenticated = function() {

      var deferred = $q.defer();
      user = {
        first_name: 'First',
        last_name: 'Last',
        email: 'email@address.com',
        access: 'institution'
      };
      deferred.resolve(user);
      me.initialized = true;

      return deferred.promise;
    };
  }
]);
然后,控制器应相应对齐:

myApp.run([
  '$rootScope', 'userService', function($rootScope, userService) {
    return userService.isAuthenticated().then(function(user) {
      if (user) {
        // You have access to the object you passed in the service, not to the response.
        // You should either put response.data on the user or use a different property.
        return $rootScope.$broadcast('login', user.email);  
      } else {
        return userService.logout();
      }
    });
  }
]);
关于该服务,需要注意的几点:

  • 仅在服务中公开需要公开的内容。用户应该在内部保存,并且只能由getter访问

  • 在函数中,使用“me”,这是一种使用javascript避免这种边缘情况的服务

  • 我猜到了初始化意味着什么,如果我猜错了,请随时纠正我


    • 对于较短的JavaScript代码,请使用以下命令:

      myApp.service('userService', [
        '$q', function($q) {
          this.initialized = $q.when();
          this.user = {
            access: false
          };
          this.isAuthenticated = function() {
            this.user = {
              first_name: 'First',
              last_name: 'Last',
              email: 'email@address.com',
              access: 'institution'
            };
            return this.initialized;
          };
        }
      ]);
      
      您知道您通过使用新对象覆盖它而不是仅设置对象属性来释放对userService.user的绑定吗

      以下是我的plnkr.co示例代码示例(工作示例: ):


      要返回已解决的承诺,您可以使用:

      return $q.defer().resolve();
      
      如果需要解析某些内容或返回数据:

      return $q.defer().resolve(function(){
      
          var data;
          return data;
      
      });
      
      如何在AngularJS中简单地返回预先解决的承诺 承诺:

      return $q.when( someValue );    // angularjs 1.2+
      return $q.resolve( someValue ); // angularjs 1.4+, alias to `when` to match ES6
      
      return $q.reject( someValue );
      
      拒绝承诺:

      return $q.when( someValue );    // angularjs 1.2+
      return $q.resolve( someValue ); // angularjs 1.4+, alias to `when` to match ES6
      
      return $q.reject( someValue );
      

      那么,承诺将如何解决?
      。然后
      将永远不会triggered@Shamoon延迟。解决();在调用它的那一刻解决,因为中没有给定值。我建议不要延迟写信。解决(“Hi”);只需延迟写入即可;得到一个明确的空洞承诺。但是您也可以使用$q.when();要得到一个可解决的空承诺;-)。我认为这比公认的答案要好,因为使用$timeout生成将要解决的承诺无法显示手动创建和解决承诺的机制。@BenjaminGruenbaum是的,你是对的,我不知道,
      $timeout
      实际上返回承诺,serviceMethod可以缩短为:return$timeout(function(){return{property:'value'};},1000);这可能行得通,但肯定不是推荐的返回方法promises@BenjaminGruenbaum我做了,现在返回$timeout生成的承诺。很好,我收回了我的-1。啊,好吧,但我仍然同意他的观点,即使是出于不同的原因!我理解否决票是令人沮丧的,我们可以使用否决票来帮助好的内容上升到顶部,但在这种情况下,我确实觉得你的答案没有帮助,因为它无法解释$q的机制,而是呈现了$q的抽象。对承诺不熟悉的人,或者像我这样熟悉承诺但又不熟悉棱角的人,可能会完全误入歧途!有人能告诉我为什么这是标记为否决票吗?我有一个更简短的版本。这正是我要找的。一种在清除http服务调用时返回静态值的简单方法。