【问题标题】:javascript service is not returning promisejavascript服务没有返回承诺
【发布时间】:2016-02-05 04:09:16
【问题描述】:

我正在开发一个 AngularJS 应用程序。我有 loginService.js 文件,它定义了如下登录服务:

(function () {

    var loginService = function ($http) {
        var login = function (userName, loginPassword) {

            var data = "grant_type=password&username=" + userName + "&password=" + loginPassword;

           $http.post("/Token", data, { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } })
                 .then(function (response) {
                     return response.data;
                 });


        };

        return {
            login: login
        };
    };

    var module = angular.module("MyApp");
    module.factory("loginService", loginService);
}());

javascript中的LoginController定义如下:

(function () {
    var app = angular.module("kanbanBoard");

    var LoginController = function ($scope, $location, loginService, localStorageService) {

        var loginData = {
            userName: "",
            loginPassword: ""
        };

        $scope.loginData = loginData;

        var onLoginComplete = function (data) {
            alert(data);
            localStorageService.set('authorizationData', { token: response.access_token, userName: userName });

            //$location.url("/");
        };

        var onError = function (result) {
            alert(result);
            $scope.error = result;
        }

        $scope.login = function () {

            loginService.login($scope.loginData.userName, $scope.loginData.loginPassword)
                          .then(onLoginComplete, onerror);
        }

    };

    app.controller("LoginController", LoginController);
}());

我在 LoginController.js 文件中得到无法获取未定义或空引用的属性'then'。据我了解,loginService 类应该返回在 LoginController 中处理的承诺。我不确定我在这里犯了什么错误。

【问题讨论】:

  • 依赖注入在这里是如何工作的?您正在注册module.factory("loginService", accountManager);(奇怪的命名?)并将其未命名地注入LoginControllerangular 是否能够在不抛出错误的情况下找到它?

标签: angularjs


【解决方案1】:

您需要通过在登录函数中返回 $http.post 来返回承诺:

      return $http.post("/Token", data, { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } })
             .then(function (response) {
                 return response.data;
             });

否则返回 void ,因此 (null).then() 会导致您提到的错误。

【讨论】:

  • 外部函数登录不会自动返回内部匿名函数的返回值...您可以链接承诺...
  • 我犯的这个愚蠢的错误。它现在正在工作。谢谢
【解决方案2】:

在对accountManager.login(...) 的调用中,您没有返回$http.post 的值,所以它会返回undefined,这肯定不是then-able。

【讨论】:

    猜你喜欢
    • 2019-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-27
    • 1970-01-01
    • 2014-05-01
    • 2017-02-21
    • 1970-01-01
    相关资源
    最近更新 更多