在工厂里回复承诺

时间:2016-01-19 12:43:28

标签: javascript angularjs angularjs-service

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

厂:

  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:无法读取属性'然后'未定义的

3 个答案:

答案 0 :(得分:4)

似乎你忘了回复你的承诺

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

提示:据我所知,{@ 1}}应该被弃用,所以只能使用.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;
};

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