我试图将数据从自定义角度JS服务返回到控制器,但它始终返回“ {}”

时间:2019-08-02 11:06:21

标签: angularjs angularjs-service angularjs-http

我编写了一个自定义的角度服务,该服务在对WCF服务进行呼叫后返回了会话ID。我可以在chrome的“网络”标签上看到该呼叫返回了会话ID,但是当我尝试通过$ http.post将其返回给调用者时,它将返回“ {}”对象。

我已在stackoverflow等中关注与该问题有关的所有问题/答案,但无济于事。我知道邮寄通知返回的诺言处理存在问题,但我不知道,也无法查明出了什么问题和问题所在。

这是自定义服务。

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”,但我得到的是“ {}”

3 个答案:

答案 0 :(得分:1)

$http.post返回一个promise,这就是您的服务方法所返回的

更改

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

收件人

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

答案 1 :(得分:1)

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

  

错误

  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的已实现承诺。

答案 2 :(得分:0)

添加用于错误回调的单个参数,然后在调用方上将promise访问器与.then关键字一起使用,可以解决此问题。以下是代码。

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