如何在角度js中使用$ q返回值?

时间:2015-10-19 13:05:31

标签: angularjs ionic

如何使用承诺返回数据 得到错误,successdata不是我的控制器中的功能,我不知道我做错了什么。我想念控制器里的东西吗? 我通过调试应用程序响应监视正在服务但没有任何东西从它返回

 var module = angular.module('app', []);
module.service("webservice", function($http,$q) {

    return {
        callservice:function(method,url,_data){
            var deferred = $q.defer();
            var promise = deferred.promise;
            $http({
                method: method,
                url: App_Service_api+url,
                data: _data,
                headers: {'Content-Type': 'application/x-www-form-urlencoded'}
            }).
            success(function (data, status, headers, config) {
                if (data.success) {
                    deferred.resolve(data.message);
                    //return deferred.promise;
                    promise.successdata = function(fn) {
                        promise.then(fn);
                        return deferred.promise;
                    }
                }
                else {
                    deferred.reject("Plase Enter valid data.");
                    //return deferred.promise;
                    promise.errordata = function(fn) {
                        alert("error");
                        promise.then(null, fn);
                        return deferred.promise;
                    }
                }

            }).
            error(function(data, status, headers, config){
                deferred.reject("Plase Enter valid data.");
                //return deferred.promise;
                promise.errordata = function(fn) {
                    promise.then(null, fn);
                    return deferred.promise;
                }
            }); 

        }
    }
})

这是我的控制器代码

webservice.callservice('POST',App_Service_login,inputs).successdata(function(data){
                var alertPopup = $ionicPopup.alert({
                    title: 'Login Succesfull!',
                    template: 'Please check your credentials!'
                });
            })
                .errordata(function(data) {
                    var alertPopup = $ionicPopup.alert({
                        title: 'Login failed!',
                        template: 'Please check your credentials!'
                    });
                });

3 个答案:

答案 0 :(得分:2)

我重构了一下你的代码。我真的不明白为什么要创建函数successdataerrordata。你可以试试这样简单的东西:

服务:

module.service("webservice", function($http, $q) {
    return {
        callservice: function(method, url, _data){
            var deferred = $q.defer();
            $http({
                method: method,
                url: App_Service_api + url,
                data: _data,
                headers: {'Content-Type': 'application/x-www-form-urlencoded'}
            }).
            success(function (data, status, headers, config) {
                if (data.success) {
                    deferred.resolve(data.message);
                }
                else {
                    deferred.reject("Plase Enter valid data.");
                }
            }).
            error(function(data, status, headers, config){
                deferred.reject("Plase Enter valid data.");
            }); 
            return deferred.promise;
        }
    }
});

控制器:

webservice.callservice('POST', App_Service_login, inputs).then(function(dataMessage){
    console.log('dataMessage', dataMessage);
    var alertPopup = $ionicPopup.alert({
        title: 'Login Succesfull!',
        template: 'Please check your credentials!'
    });
})
.catch(function(errorMessage) {
    console.log('errorMessage', errorMessage);
    var alertPopup = $ionicPopup.alert({
        title: 'Login failed!',
        template: 'Please check your credentials!'
    });
});

更新:

这个service代码应该通过返回correct http status code的服务器端进行一些修改来改进。使用此更改而不是在出现某些验证错误时返回属性data.success = false,您应该返回Status 400 Bad Requestdata.message = 'Please Enter valid data'。这样做,您应该从响应中删除属性data.success,控制器将保持不变,并且您的服务将变为:

服务:

module.service("webservice", function($http, $q) {
    return {
        callservice: function(method, url, _data){
            return $http({
                method: method,
                url: App_Service_api + url,
                data: _data,
                headers: {'Content-Type': 'application/x-www-form-urlencoded'}
            });
        }
    }
});

来自Angular $http doc

  

200到299之间的响应状态代码被视为成功   status并将导致调用成功回调。注意   如果响应是重定向,XMLHttpRequest将透明   按照它,意味着不会为此调用错误回调   响应。

答案 1 :(得分:0)

也许我没有让你的代码正确,但我认为这很复杂。 只需:

    success(function (data, status, headers, config) {
        if (data.success) {
            deferred.resolve(data.message);
        }else{
            deferred.reject(...)
        }

webservice.callservice('POST',App_Service_login,inputs)
.then(function(data){
   var alertPopup = $ionicPopup.alert({..})
}, function(err){
  //errorhandling
});

答案 2 :(得分:0)

$http本身正在返回一个承诺,所以没有必要在那里创建一个新的deferrable。

整个事情可以简化为:

var module = angular.module('app', []);
module.service("webservice", function($http,$q) {

    return {
        callservice:function(method,url,_data){
            return $http({
                method: method,
                url: App_Service_api+url,
                data: _data,
                headers: {'Content-Type': 'application/x-www-form-urlencoded'}
            }).
            then(function (response) {
                if (response.data.success) {
                    return data.message;
                }
                else {
                    $q.reject("Plase Enter valid data.");
                }
            }, function() {
                $q.reject("Plase Enter valid data.");
            }); 
        }
    }
});