Как СУХОЙ http успех и функции ошибок? - PullRequest
0 голосов
/ 25 апреля 2018

Скажите, что у меня есть более чем 1001 запрос в моей заявке.Было бы громоздким и трудоемким написать как можно больше success и error функций для обработки response.

. На данный момент я делаю так:

angular
  .module('mahanApp')
  .service('HttpService', function($http) {
      // Get all  name
      function getNames() {
        return $http.get('/data/names/')
      }

      return {
        getNames: getNames
      }
      .controller('NameController', function NameController(
        HttpService) {
        var ctrl = this;

        // Fetch all templates name;
        HttpService.getNames().then(
          function success(response) {
            ctrl.names = response.data;
          },
          function error(response) {});
      })
  });

Как видите, написано так много функций обратного вызова для 100+ запросов.Интересно, можно ли этого избежать.

Есть этот вопрос , который предлагает сделать как код ниже.

angular
  .module('mahanApp')
  .service('HttpService', function($http) {

    var success = function(response) {
        return response.data;
      },
      error = function(error) {
        return error.data;
      };

    // Get all  name
    function getNames() {
      return $http.get('/data/names/').then(success, error)
    }

    return {
      getNames: getNames
    }
    .controller('NameController', function NameController(
      HttpService) {
      var ctrl = this;

    })
  });

В NameController я использовал ctrl.names = HttpService.getNames().Но ctrl.names - это undefined.Как использовать HttpService.getNames() в NameController?

Обновление:

Несколько человек прокомментировали решение обещания.

HttpService.getNames().then(function success(result) {
  ctrl.names = result;
})

Работает.Тем не менее, я все еще пишу 100+ функций для разрешения обещания.

Как избежать повторения функций success и error или, если возможно, всего метода then()?

1 Ответ

0 голосов
/ 26 апреля 2018

Я постараюсь подвести итоги обсуждения и рассказать о некоторых способах устранения дублирования:

Прежде всего, ваш второй подход - правильное направление для повторного использования функции в ваших контроллерах.

Классический подход был бы следующим:

return {
  getNames: getNames
}
.controller('NameController', function NameController(
  HttpService) {
  var ctrl = this;
  HttpService.getNames().then(function(res) { ctrl.names = res; } );
})

Обратите внимание, что вы можете даже извлечь это больше, если все ваши вызовы имеют одинаковый формат, например, вы могли бы:

// utility function that loads something into your controller
var load = function(request, ctrl, prop) {
    request.then(function(res) { ctrl[prop] = res; } 
};

// this way you can have many of requests with minimal code
load(HttpService.getNames, ctrl, 'names');
load(HttpService.getBooks, ctrl, 'books');
load(HttpService.getThings, ctrl, 'things');
...

В качестве альтернативы, если вы можете использовать ES2017 в своем проекте (например, ваш код переносится), вы можете упростить использование некоторых новых функций без необходимости в дополнительной функции:

// Using promise all will assure these are all fetched asynchronously in respect to one another
Promise.all([
    async () => ctrl.names = await HttpService.getNames(),
    async () => ctrl.books = await HttpService.getBooks(),
    async () => ctrl.things = await HttpService.getThings()
]);

Наконец, вы можете захотетьпараметризовать ваш запрос так, чтобы у вас был только один:

// Get all
function getAll(what) {
  return $http.get('/data/' + what).then(success, error)
}

Тогда вам не нужно иметь разные методы для каждого типа, вы просто сделаете:

getAll('names');
getAll('books');
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...