在工厂里回报承诺

Returning a promise in a factory

我可以 return 工厂承诺在我的控制器中使用下面的示例:

工厂:

  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: Cannot read property 'then' of undefined

看来你忘记了return你的承诺

    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");
    };

了解 $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

您需要使用延迟对象。首先将 $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
}

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