Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何包装$http服务并将其获取的数据用于控制器?_Javascript_Angularjs_Http - Fatal编程技术网

Javascript 如何包装$http服务并将其获取的数据用于控制器?

Javascript 如何包装$http服务并将其获取的数据用于控制器?,javascript,angularjs,http,Javascript,Angularjs,Http,我想做的是包装$http调用,这样我就可以在我的应用程序中的任何地方使用它,而无需直接使用它。另外,根据我从服务器接收到的信息,我希望显示一条消息或其他常规内容,并分离逻辑。我的问题是我无法访问服务器发送的数据。我做错了什么 这是我的服务,我将$http包装在其中: Application.service('test', ['$http', function ($http) { this.test = function() { console.log('testt

我想做的是包装$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

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

test.fetchData('/jewelry-room/move-user.action',函数(数据){},函数(数据){},{user:2000,任务:7});

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


successCallback(数据)

您实际上不需要传递成功和错误回调,因为
$http.get
返回一个承诺。从文件:

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

为了理解延迟和承诺

fetchData
函数可能如下所示:

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

我明白你的意思,但我需要先在fetchData函数中处理响应,然后进一步传递数据,因为当服务器出错时,我需要向用户发送某种反馈,然后返回一个承诺,您可以链接它们。文档对承诺链有一些解释。请参阅我编辑的答案。其中的函数分别是成功回调和错误回调?完全正确。然后(successCallback、errorCallback、notifyCallback)。事情终于开始有了意义。谢谢你的帮助,康斯坦丁先生