【问题标题】:AngularJS services and promises best practiceAngularJS 服务并承诺最佳实践
【发布时间】:2016-07-11 14:59:53
【问题描述】:

我有一个 AngularJS 应用程序,我有一个 services 调用 $http 资源并返回一个 promise 我在我的控制器中解析。这是我正在做的一个示例:

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');
});

然后在controller 级别进行验证、错误美化、链接承诺等。

我的问题是:在代码弹性和灵活性方面,哪一个被认为是“最佳实践”(如果有的话)?或者有没有比这更好的方法来做到这一点?

【问题讨论】:

  • IMO 最好在服务中保留验证、错误美化、链接承诺等,因为您可以使用来自不同控制器的服务,这样您就不会重复代码
  • .then 返回一个新的承诺,因此您不必显式使用$q 服务,因为它基本上是在做同样的事情。
  • @ProfessorAllman 如果我有一些数据按摩逻辑怎么办?就像 $scope.post = someMethod(res.data[0]);$scope.error = if (res.err.details.code === 400) doThis(); else doThat(); 这样做被认为是好事

标签: javascript angularjs design-patterns promise


【解决方案1】:

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

服务应该发起承诺。

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);
})

【讨论】:

  • 我会接受的。喜欢你介绍DataProcessorErrorHandler 概念的方式。很公平:)
  • @PrashantGhimire 您看到这种方法的实用性(我从其他人那里学到的)是控制器可以启动该过程并设置各种标志。然后它可以决定响应到达时要做什么。除非特别需要,否则不应将其打包到服务中。好问题;)
猜你喜欢
  • 1970-01-01
  • 2017-12-12
  • 1970-01-01
  • 2018-10-12
  • 1970-01-01
  • 1970-01-01
  • 2011-12-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多