Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/460.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript AngularJS服务和承诺最佳实践_Javascript_Angularjs_Design Patterns_Promise - Fatal编程技术网

Javascript AngularJS服务和承诺最佳实践

Javascript AngularJS服务和承诺最佳实践,javascript,angularjs,design-patterns,promise,Javascript,Angularjs,Design Patterns,Promise,我有一个AngularJS应用程序,其中我有服务s,它调用$http资源并返回我在控制器中解析的承诺。下面是我正在做的一个示例: app.service('Blog', function($http, $q) { var deferred = $q.defer(); $http.get('http://blog.com/sampleblog') .then(function(res) { // data massaging stuffs return

我有一个AngularJS应用程序,其中我有
服务
s,它调用
$http
资源并返回我在控制器中解析的
承诺
。下面是我正在做的一个示例:

app.service('Blog', function($http, $q) {
  var deferred = $q.defer();
  $http.get('http://blog.com/sampleblog')
    .then(function(res) {
        // data massaging stuffs
      return deferred.resolve(res.data);
    }, function(err) {
        // may be some error message checking and beautifying error message
      return deferred.reject(err);
    });
    // chain if further more HTTP calls
  return deferred.promise;
});
但我也可以简单地做到以下几点:

app.service('Blog', function($http) {
  return $http.get('http://blog.com/sampleblog');
});
然后在
控制器
级别执行验证、错误美化、链接承诺等


我的问题是:在代码弹性和灵活性方面,哪一种被认为是“最佳实践”(如果有的话)?或者有没有更好的方法完全不同于此?

根据MVC背后的概念,控制器应该决定如何处理承诺

服务应发起承诺

app.service('Blog', function($http) {
  return $http.get('http://blog.com/sampleblog');
});
控制器应决定解决问题时要做什么

$scope.response = Blog;

$scope.response.then(function(response) {
    DataProcessor.processData(response.data)
})
.error(function(error){
    ErrorHandler.handle(error);
})

IMO最好在服务中保留验证、错误美化、链接承诺等,因为您可以使用来自不同控制器的服务,这样,您就不会重复代码返回一个新的承诺,因此您不必显式使用
$q
服务,因为它基本上在做相同的事情。@ProfessorAllman如果我有一些数据处理逻辑怎么办?比如说做
$scope.post=someMethod(res.data[0])被认为是好的
$scope.error=if(res.err.details.code==400)doThis();否则就不必了我要了。喜欢你介绍
DataProcessor
ErrorHandler
的概念。很公平:)@PrashantGhimire您可以看到这种方法的实用性(我从其他人那里学到了),即控制器可以启动流程,并设置各种标志。然后它可以决定在响应到达时做什么。除非特别需要,否则不应将其打包到服务中。好问题;)