2015-03-19 81 views
0

嘿,我试图建立一些默认的验证$ http承诺。我这样做的原因是因为我有多个请求返回相同的结果。所以这将是合乎逻辑的,从减少代码的要求单独处理程序复制

比方说,我有这样的要求:

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的承诺并将其发送到服务

感谢@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?"); 
      }); 
     }; 
    }) 
+0

这就是所谓的transformResponse ? – 2015-03-19 11:31:15

回答

1

没有,返回data.data.users是完全正常。你要return处理数据的承诺,让您的来电者可以像

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; 
    }); 
}, 
+0

但为什么我应该这样做,而不是为它做一个promiseHandler?这些代码中的大部分将被用于20次左右,为什么添加20行时,您可以用一行代码调用相同的函数? – 2015-03-19 11:58:54

+0

@SjoerdDeWit:我认为'handleResult'会因每个请求而不同吗? – Bergi 2015-03-19 12:05:31

+0

如果每次都是相同的处理程序,那么'return handleResult(processUsers(data.data.users))'应该可以工作。 – Bergi 2015-03-19 12:06:20