如何包装$ http服务并获取它在控制器中使用的数据?

时间:2015-08-26 10:20:50

标签: javascript angularjs http

我想要做的是将$ http调用包装好,这样我就可以在我的应用程序中随处使用它作为函数而不直接使用它。另外,根据我从服务器收到的内容,我想显示一条消息,或其他一般事物并将逻辑分开。我的问题是我无法访问服务器发送的数据。我做错了什么?

这是我的服务,我将$ http包裹在:

Application.service('test', ['$http', function ($http)
{
    this.test = function()
    {
        console.log('testttt');
    }

    this.fetchData = function(url, successCallback, errorCallback, parameters)
    {
        if (parameters)
        {
            $http.get(url, {params: parameters})
                .success(function (data) {
                    successCallback();
                })
                .error(function (data) {
                    errorCallback();
                })
                .finally(function(data){
                    console.log(data);
                });
        }
        else
        {
            $http.get(url)
                .success(successCallback)
                .error(errorCallback)
                .finally(function(data) {
                    console.log('finally');
                    console.log(data);
                    if (data.message)
                        console.log(message);
                });
        }

    }
}])

我称之为控制器:

Application.controller('AccessLoggingController', ['$scope', '$http', 'initData', 'test', function($scope, $http, initData,test)
{
    test.fetchData('/jewelry-room/move-user.action', function(){}, function(){}, {user:2000, task:7});
... etc more code

2 个答案:

答案 0 :(得分:2)

您不需要传递成功和错误回调,因为fetchData会返回一个承诺。来自$http文档:

  

$ http API基于$ q公开的延迟/承诺API   服务。虽然对于简单的使用模式,这并不重要   高级用法,熟悉这些API非常重要   以及他们提供的保证。

为了理解延迟和承诺please see this SO question

this.fetchData = function(url, parameters) { return $http.get(url, {params: parameters}).then( function(response) { // do something return response; // resolves a promise }, function(response) { // do something return $q.reject("Unable to fetch!"); // rejects a promise }); } 函数可能如下所示:

test.fetchData('/jewelry-room/move-user.action', {user:2000, task:7}).then(
    function(result) {
        // success callback
        $scope.action = result;    
    }, 
    function(result) {
        // error callback
        $window.alert(result); // alerts "Unable to fetch!"
    });

然后您可以在控制器中使用服务:

this.fetchData = function(url, successCallback, errorCallback, parameters) {
    return $http.get(url, {params: parameters}).then(successCallback, errorCallback);
}

或者,如果您仍想出于某种原因传递回调:

{{1}}

答案 1 :(得分:0)

我认为你的回调应该采用数据参数,即

test.fetchData('/jewelry-room/move-user.action', function(data){}, function(data){}, {user:2000, task:7});

在fetchData方法中,你应该传递数据参数,即

successCallback(data);