如何从控制器上的服务获得响应

时间:2015-09-24 15:00:11

标签: javascript ajax angularjs

我试图将$ http.post()调用分成" .factory()",但是想获取控制器上异步的响应。有没有办法做到这一点?

控制器:

 .factory( 'Login' , function($http,SERVERURL){
    var serverUrl = SERVERURL;

    return {
        'post' : function(user){
            $http.post(serverUrl+'/login', user).
                then(function(response) {
                    console.log(response);
                }, function(response) {
                // called asynchronously if an error occurs
                // or server returns response with an error status.
                });    
        }
    };
})

厂:

{{1}}

有一个.then()但我希望在控制器上,所以我可以相应地表现。谢谢!

4 个答案:

答案 0 :(得分:2)

基本上你需要返回$http.post承诺,并且从success函数中你可以返回一个将返回给这个方法的使用者的数据。这样您就可以轻松地从控制器和工厂调用工厂方法。在该调用的.then函数内,您可以successerror函数。

<强>代码

.factory('Login', function($http, SERVERURL) {
     var serverUrl = SERVERURL;
     return {
         'post': function(user) {
             return $http.post(serverUrl + '/login', user).
             then(function(response) {
                 console.log(response);
                 return response.data; //return data from here
             }, function(response) {
                 // called asynchronously if an error occurs
                 // or server returns response with an error status.
             });
         }
     };
 })

<强>控制器

Login.post().then(function(data){ //success function
    console.log(data)
}, function(error){ //error function
    console.log(error);
})

答案 1 :(得分:0)

Angular's $http方法返回一个Promise。

  

$ http API基于$ q服务公开的延迟/承诺API。

<强>工厂

您的方法post尚未返回任何内容,但可以简单地返回通过调用$http.post创建的Promise:

.factory('Login' , function($http, SERVERURL){
    var serverUrl = SERVERURL;

    return {
        'post' : function (user) {
            return $http.post(serverUrl + '/login', user)
//          ^^^^^^
                .then(function (response) {
                    console.log(response);
                    return response.data;
                }, function (response) {
                    // called asynchronously if an error occurs
                    // or server returns response with an error status.
                });
        }
    };
});

<强>控制器

然后通过调用then来消耗返回的Promise的结果:

Login.post($scope.user).then(function (res) {
    // do something with `res`...
});

答案 2 :(得分:0)

您可以添加回调参数。

.factory( 'Login' , function($http,SERVERURL){
var serverUrl = SERVERURL;

return {
    'post' : function(user, callback){
        $http.post(serverUrl+'/login', user).
            then(function(response) {
                console.log(response);
                callback(null, response);
            }, function(response) {
            // called asynchronously if an error occurs
            // or server returns response with an error status.
                callback(response);
            });    
    }
};
})

你的控制器将成为:

Login.post($scope.user, function(err, response) {
  if(err) {} //do something if there is an error
  // or deal with the response
});

答案 3 :(得分:0)

要向控制器返回任何响应,请执行以下操作:

return {
    'post' : function(user){
        return $http.post(serverUrl+'/login', user);
    }
};

在您的控制器中,您已拨打.then()