簡體   English   中英

angularJS服務 - 返回用於檢索數據的承諾和用於管理數據的對象?

[英]angularJS services - return promise for retrieving data AND object for managing data?

我對angularJS服務有疑問。

根據我的閱讀,有兩種使用服務的方式。

[1]讓服務返回承諾返回數據。 如果使用此方法,則在routeProvider中,您可以確保Angular解析此承諾,以便在加載頁面之前返回數據。

例如

App.factory('BooksService', function($q, $http) {
  var deferred = $q.defer();
  $http.get('/rest/books').then(function(data) {
     deferred.resolve(data);
  }, function(err) {
     deferred.reject(data);
  });
  return deferred.promise;
};

然后,在我的路線提供者:

...
  $routeProvider.when('/books', {
    controller : 'BooksCtrl',
    templateUrl: '/partials/books.html',
    resolve: {
       books: 'BooksService'
    }
  });
...

然后,在我的控制器中:

App.controller('AddPaypalAccountCtrl', function($scope, BooksService) {
    $scope.books = BooksService;
}

[2]讓服務返回包含函數和數據的對象。

例如

App.factory('BooksService', function($q, $http) {
  var books = [];
  var service = {
      getBooks : function() {
         return books;
      },
      addBook: function(book) {
         books.push(book);
      }
  };
  return service;
};

我的問題:是否有可能充分利用這兩個世界並讓服務返回一個承諾,當解析時返回一個包含函數和數據的對象?

在加載'/ books'頁面之前,我想要$ http調用來解析書籍,但我也希望能夠訪問可以管理所述書籍的服務。 當然我可以編寫兩個單獨的服務,但是我想知道將它們保存在同一個服務中是否更有效率並編寫一個像一條石頭一樣殺死兩只鳥的服務:

這是我的工廠的一個例子,它返回了檢索書籍的承諾。

App.factory('BooksService', function($q, $http) {
  var books = [];
  var service = {
     getBooks: function() {
         return books;
     },
     addBook: function(book) {
         books.push(book);
     }
  }
  var deferred = $q.defer();
  $http.get('/books').then(function(data) {
     books = data.data;
     deferred.resolve(service);
  , function(err){ 
     deferred.reject(err);
  });
  return service;
};

然后,按照以前的說法,我的路線提供商如下,要求在我進入/ books頁面之前檢索書籍:

...
  $routeProvider.when('/books', {
    controller : 'BooksCtrl',
    templateUrl: '/partials/books.html',
    resolve: {
       books: 'BooksService'
    }
  });
...

然后,在我的控制器中,我會將書籍附加到范圍內。

App.controller('AddPaypalAccountCtrl', function($scope, BooksService) {
    $scope.books = BooksService.getBooks();
}

我還沒有看到有人這樣做過,所以我想知道這是否合適。

我覺得你正試圖打破SRP - 單一責任原則。

您的服務的責任是什么? 為異步請求提供API或發出請求? 如果它提供API,則不應加載異步。 如果也是請求,它應該是服務的方法,而不是服務本身。 服務是您的請求的接口 ,而不是請求!

您很少需要從服務器獲取邏輯,但同樣,您必須分開關注:

  • 從服務器獲取邏輯(例如,Angular表達式作為字符串)。

  • 解析為執行邏輯的函數(可以使用Angular $parse服務完成)。

  • 在需要使用它的地方注入邏輯功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM