javascript - 从 Angular $http 获取 promise 数据

标签 javascript angularjs promise angular-promise

嘿,我正在尝试为 $http promise 构建一些默认验证。我这样做的原因是因为我有多个返回相同结果结构的请求。因此,将处理程序与请求分开以减少代码重复是合乎逻辑的

假设我有这个请求:

    getMoreUsers: function(searchid, apiroute, limit) {
        console.log(apiroute);
        return $http({
            method: 'get', 
            url: WeAlertApiUrl + apiroute,
            params: {
                'searchid' : searchid,
                'start' : limit }
        }).then( function(data) {
           if(data.data.isValid === true) {
              return processUsers(data.data.users);
           }else {
              $cordovaToast.showShortTop(data.data.message).then(function(success) {
              }, function (error) {alert(data.data.message);});
           }
        }, function(error) {
            $cordovaToast.showShortTop("something went wrong..").then(function(success) {
            }, function (error) {alert("Something went wrong..");});
        }); 
    },

唯一不一致的是data.data.users 所以理想情况下我想构建这样的东西:

getMoreUsers: function(searchid, apiroute, limit) {
        console.log(apiroute);
        return $http({
            method: 'get', 
            url: WeAlertApiUrl + apiroute,
            params: {
                'searchid' : searchid,
                'start' : limit }
        }).then( 
           return handleResult(processUsers(data.data.users))
        }); 
    },

这可以实现吗?我如何访问 $http 的 promise 并将其发送到服务

感谢@Bergi,我能够解决它! getmoreusers 服务现在看起来像

    getMoreUsers: function(searchid, apiroute, limit) {
        console.log(apiroute);
        return $http({
            method: 'get', 
            url: WeAlertApiUrl + apiroute,
            params: {
                'searchid' : searchid,
                'start' : limit }
        }).then(function(res){return successHandler(res, 'users');}, errorHandler);
    },

成功和错误处理程序的包装如下:

.factory('successHandler', function($cordovaToast, processAlerts, processUsers, processBerichten, processReacties, processUserAlerts) {
        return function(data, type) {
            if(data.data.isValid === true){
                switch(type){
                    case 'users':
                        return processUsers(data.data[type]);
                    case 'alerts':  
                        return processAlerts(data.data[type]);
                    case 'berichten':   
                        return processBerichten(data.data[type]);
                    case 'reacties':    
                        return processReacties(data.data[type]);
                    case 'useralerts':  
                        return processUserAlerts(data.data[type]);              
                }
            }else {
                $cordovaToast.showShortTop(data.data.message).then(function(success) {
                }, function (error) {alert(data.data.message);});
            }   
        };
    }).factory('errorHandler', function($cordovaToast) {
        return function(error) {
            $cordovaToast.showShortTop("Er ging iets mis... bent u verbonden met het internet?").then(function(success) {
            }, function (error) {
                alert("Er ging iets mis... bent u verbonden met het internet?");
            });
        };
    })

最佳答案

不,返回data.data.users完全没问题。您需要返回已处理数据的 promise ,以便您的调用者可以像这样使用它们

getMoreUsers(…).then(handleResult);

为此,全局错误处理程序还应该重新抛出异常

getMoreUsers: function(searchid, apiroute, limit) {
    console.log(apiroute);
    return $http({
        method: 'get', 
        url: WeAlertApiUrl + apiroute,
        params: {
            'searchid' : searchid,
            'start' : limit }
    }).then(function(data) {
        if (data.data.isValid) {
            return processUsers(data.data.users);
        } else {
            throw new Error(data.data.message);
        }
    }, function(error) {
        throw new Error("something went wrong.."); // ignore `error` details
    }).catch(function(error) {
        $cordovaToast.showShortTop(error.message).catch(function(showError) {
            alert(error.message);
        });
        throw error;
    }); 
},

关于javascript - 从 Angular $http 获取 promise 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29143376/

相关文章:

angularjs - Angular.module 默认名称

javascript - 从 Angular Promise 获取数据

javascript - Jasmine 测试 : Expected undefined to equal Object

javascript - 减少图像加载时间?

javascript - 如果它是外部链接,如何将 rel = "nofollow"添加到 CKEditor 中的链接

javascript - 循环 promise !如何?

node.js - nodejs+Q promise : no Reference Exception in the fulfillment handle

Javascript Promise 模式 - 区分错误

javascript - 使用谷歌地理定位坐标数组和从开始到结束的持续时间来计算步速

javascript - 我如何使用 jPanelMenu? (jquery 菜单插件)