AngularJS异步请求方法服务使用promise返回数据

时间:2014-06-20 10:45:50

标签: javascript ajax angularjs rest

我在自定义服务中有这个全局方法。

/**
 * Global service class for making http requests.
 */
app.service('API', function ($http) {

    /**
     * Process remote POST request to give URL with given params
     * @param {String} url
     * @param {String} POST params
     * @return {JSON}  response from server
     */
    this.doHttpRequest = function (type, url, params) {
        $http({
            method: type,
            url: url,
            data:params,
            timeout:2000,
            headers: {"Content-Type": "application/json"}
        })
            .success(function (data, status, headers, config) {
                // successful data retrieval
                console.log("request success");
                console.log("state: "+status);
                return data;
            })
            .error(function (data, status, headers, config) {
                // do some stuff
            });
    };
});

||

问题是,如果我试图从我的cotroler方法得到回应,我总是只是未定义。

/**
 * Test of service
 */
$scope.serviceTest = function () {

    var requestParams = {
        "token":'test',
        "data":{
            "test":'test'
        }
    };

    var url = $rootScope.apiBaseUrl + "user/update";

    var result = API.doHttpRequest("POST", url, requestParams);
    // HERE I GET UNDEFINED 
    console.log("Result is: " + result);
};

我对承诺表示赞同,但没有运气来获取数据。

问题是:

我应该如何修改我的代码以获取返回的值?

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

修改您的服务,使其不会在promise返回的$http上调用任何内容,同时注意return

app.service('API', function ($http) {

    /**
     * Process remote POST request to give URL with given params
     * @param {String} url
     * @param {String} POST params
     * @return {JSON}  response from server
     */
        this.doHttpRequest = function (type, url, params) {
          return $http({
            method: type,
            url: url,
            data:params,
            timeout:2000,
            headers: {"Content-Type": "application/json"}
        });

    };
});

然后当您使用服务时,它会返回promise,您可以在{/ 1}}和success上运行

error

答案 1 :(得分:0)

这是我使用promises和$ http请求

的小工作代码
var app = angular.module('plunker', []);

app.controller('MainCtrl', function($scope, dataService) {
  dataService.then(function (data) {
    $scope.data = data
  })
});

app.controller('SecondCtrl', function($scope, dataService) {
  dataService.then(function (data) {
    $scope.secData = data
  })
});

app.service('dataService', function ($http, $q){
  var defferer = $q.defer()

  $http.jsonp('http://ip.jsontest.com/?callback=JSON_CALLBACK').success(function (data){
    defferer.resolve(data)
  })

  return defferer.promise
})

http://plnkr.co/edit/o3W6U9?p=info