我正在尝试 return 来自自定义 angular JS 服务的数据到控制器,但它总是 returning "{}"

I am trying to return a data from custom angular JS service to the controller but it is always returning "{}"

我编写了一个自定义 angular 服务,在对 WCF 服务进行 post 调用后,该服务 return 是会话 ID。我可以在 chrome 的网络选项卡上看到该呼叫已 return 编辑了会话 ID,但是当我尝试通过 $http.post 将其 return 发送给呼叫者时returns“{}”对象。

我已经在 Whosebug 等中关注了与此问题相关的所有 questions/answers,但无济于事。我知道 return 调用 return 的 promise 处理存在问题,但我不知道也无法查明哪里出了问题。

这是定制服务。

angApp.service('RPCService', function($http) {

    var url_login = 'http://xxxxxxx';

    this.Login = function(request) {

        return $http.post(url_login, request)
                            .then(function (result) {
                                return result.data;
                                },
                            function (data, status) {
                                console.log(data + status);
                            });

    };

这是来电者。

angApp.controller('exportController', ['$scope', 'RPCService', function ($scope, RPCService) {

    $scope.export = {};

    $scope.exportLogin = function(){

        var req = {
                    "SiteId" : $scope.export.xxx,
                    "UserName" : $scope.export.xxx,
                    "Password" : $scope.export.xxx
                    };

        $scope.export.sessionId = RPCService.Login(req);
    };

我希望输出为 "SessionId" : "xxxxxxxx" 但我得到的是“{}”

$http.post returns 一个承诺,这就是您的服务方法返回的内容

改变

$scope.export.sessionId = RPCService.Login(req);

RPCService.Login(req).then(function(data){
   $scope.export.sessionId = data;
})

错误处理程序的签名错误:

ERRONEOUS

  return $http.post(url_login, request)
                        .then(function (result) {
                            return result.data;
                            },
                        function (data, status) {
                            console.log(data + status);
                        });

更好

return $http.post(url_login, request)
 .then(function (result) {
    return result.data;
 },
  function (response) {
    var data = response.data;
    var status = response.status;
    console.log(data + status);
    //IMPORTANT re-throw error
    throw response;
});

在拒绝处理程序中重新抛出错误很重要。否则,被拒绝的承诺将转换为价值undefined.

的已履行的承诺

为错误回调添加单个参数,然后在调用者上使用带有 .then 关键字的 promise 访问器解决了这个问题。以下是代码。

this.Login = function(request) {

    return $http.post(url_login, request)
                        .then(function (result) {
                            return result.data;
                            },
                        function (response) {
                            var data = response.data;
                            var status = response.status;
                            console.log(data + " | " + status);
                            throw response;
                        });

};

在控制器上

RPCService.Login(req).then(function(data){
       $scope.export.sessionId = data.SessionId;
    });