2015-06-27 57 views
0

我记得在堆栈溢出时看到很多次将角度$ http调用委托给服务而不是在控制器中执行的建议。当需要服务以某种方式修改响应对象时,我可以看到这样做的清洁程度,然后再将其传递回控制器。

但是,如果不需要修改响应呢?在这种情况下,在控制器中使用一个函数调用服务返回一个$ http请求似乎是多余的。有什么其他的原因,我可以知道要保留$ http呼叫服务,而不是控制器?

例如

// in controller 

function potatoChipTime() { 
    chip = chipService.getAPotatoChip(); 
} 


// in service (inject $q and $http) 

var service = { 
    getAPotatoChip: getAPotatoChip 
} 

return service; 

function getAPotatoChip() { 
    var deferred = $q.defer(); 
    $http.get(url) 
     .success(function(response) { 
      deferred.resolve(response); 
     )}.error(function(error) { 
      deferred.reject(error) 
     }); 
    return deferred.promise; 
} 


// redundant, no? a lot of fuss to get a potato chip? 

回答

0

我同意你的意见。如果服务在多个控制器中重复使用,并且不只是简单地发出HTTP请求,我通常只会将这些代码放入服务中。

请注意,您的服务代码不利用承诺链接,因此使用承诺反模式。所有你需要的

function getAPotatoChip() { 
    return $http.get(url).then(function(response) { 
     return response.data; 
    }).catch(function(response) { 
     return $q.reject(response.data); 
    }); 
} 

,或者,如果你真的不关心承诺是否被拒绝,该数据或在错误的情况下,完全应答:

function getAPotatoChip() { 
    return $http.get(url).then(function(response) { 
     return response.data; 
    }); 
} 
+0

谢谢!所以如果我使用一个函数来调用你提供的函数,如果数据是从catch函数返回的,那么调用函数就不会将它与有效的响应区分开来吗?我想我曾尝试过那样,那就是发生了什么事。那就是你的意思是“承诺反模式”? – claireablani

+0

是的,它会,因为catch函数返回一个被拒绝的承诺。第一个片段相当于你的。 –

+0

所以它发生在我身上,也许你会把$ http函数放在服务而不是控制器中的原因是因为控制器的几十个实例可能会在页面上实例化,但是服务只能实例化一次? – claireablani