2015-03-19 84 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