【问题标题】:Returning a promise in a factory在工厂兑现承诺
【发布时间】:2016-01-19 12:43:27
【问题描述】:

我可以在工厂返回一个承诺,以在我的控制器中使用下面的示例:

工厂:

  angular
    .module('security.authorisation')
    .factory('AuthService', [
      '$http',
      AuthService
    ]);


  function AuthService($http, Endpoints, toastr) {
    var authService = {};
    // Login function.
    authService.login = function (user, success, error) {
      var login_url = Endpoints.getUrl("login");
      $http.post(login_url)

        .success(function (data) {

      }).then(function (temp) {
       console.log("suc");
      }, function (err) {
        console.log("err");
      });

    };



    return authService;
  }

登录控制器:

(function () {
  'use strict';

  angular
    .module('login')
    .controller('LoginController', [
      '$scope',
      'AuthService',
      LoginController
    ]);

  function LoginController($scope, AuthService) {


    $scope.submit = function submit() {

      $scope.app = AuthService.initModel;
      AuthService.login($scope.app)

        .then(function (greeting) {
          alert('Success: ' + greeting);
        }, function (reason) {
          alert('Failed: ' + reason);
        });


    }

  }
})();

我得到错误:

TypeError: 无法读取未定义的属性“then”

【问题讨论】:

    标签: javascript angularjs angularjs-service


    【解决方案1】:

    你好像忘记兑现承诺了

        authService.login = function (user, success, error) {
          var login_url = Endpoints.getUrl("login");
          return $http.post(login_url)
    
            .success(function (data) {
    
          }).then(function (temp) {
           console.log("suc");
          }, function (err) {
            console.log("err");
          });
          //toaster.pop('success', "title", "text");
        };
    

    【讨论】:

      【解决方案2】:

      阅读关于 $q... 1. 将 $q 注入你的服务 2.创建延迟对象 3. 调用你的服务时使用.then

      function returningPromise(){
      var deferred = $q.defer();
      
      callToWhateverYouWantWithReturningPromise().then(function(data){
      deferred.resolve(data);
      }, function(error){
      deferred.reject(error);
      });
      return deferred.promise
      

      【讨论】:

        【解决方案3】:

        您需要使用延迟对象。首先将$q 注入您的登录工厂。

        之后,更改您的登录功能:

        提示:据我所知,.success() 应该被弃用,所以只使用.then() 进行成功和错误回调。

        authService.login = function(user, success, error) {
          var login_url = Endpoints.getUrl("login");
          var deferred = $q.defer();
          $http.post(login_url)
            .then(function(temp) {
              console.log("suc");
              deferred.resolve(temp);
            }, function(err) {
              console.log("err");
            });
          //toaster.pop('success', "title", "text");
          return deferred;
        };
        

        在您的控制器中,您应该使用以下内容:

        AuthorisationService.login($scope.app).then(function(success) {
          // do your stuff here as you please
        }
        

        这应该可以解决您的问题,并且您应该以正确的方式处理承诺。

        【讨论】:

        • 虽然这行得通,但实际上没有必要。 $http 返回一个 promise,这意味着将 $http 包装在 deferred 中会增加不必要的复杂性。
        • 没错!如果您正在触发异步请求,这将是必要的。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-27
        • 2015-05-20
        相关资源
        最近更新 更多