angularjs - 如何在 Angular JS 中使用 $q 返回值?

标签 angularjs ionic-framework

如何使用promise返回数据
收到错误,成功数据不是我的 Controller 中的函数,我不知道我做错了什么。我是否错过了 Controller 中的某些内容? 我通过调试观察到应用程序响应正在投入使用,但没有任何返回

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

        }
    }
})

这是我的 Controller 代码

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

最佳答案

我重构了一些你的代码。真诚地,我不明白为什么要创建函数 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;
        }
    }
});

Controller :

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

更新:

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

服务:

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 :

A response status code between 200 and 299 is considered a success status and will result in the success callback being called. Note that if the response is a redirect, XMLHttpRequest will transparently follow it, meaning that the error callback will not be called for such responses.

关于angularjs - 如何在 Angular JS 中使用 $q 返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33215228/

相关文章:

javascript - 如何测试或排除故障? Node.js 上的 Ionic 框架(与 Angular.js)

javascript - 使用 ng-include 简单显示 html 元素

javascript - Ng-Click 未被触发

javascript - 我根本不了解 Angular 数据绑定(bind)

javascript - Angular/ ionic : update view with ng-repeat binds to an array

html - 在 ionic 4 中播放直播

ios - 应用程序右侧的 ionic 空白

javascript - 两个不同的JSON源,不同时间更新;在 ng-Repeat 列表中使用结果

javascript - 如何使 AngularJS 中的表单无效? (或者如何禁用 angularjs 中的表单?)

javascript - ionic 版本和android-versionCode之间的区别?