Непредсказуемый и неполный ответ $http в angularjs

Я разрабатывал свое приложение, используя файл json на своем локальном компьютере, и теперь я готов начать тестирование на сервере, но по какой-то причине я получаю неполные ответы на свои запросы $http.

У меня есть следующая служба, которая запрашивает все данные, используя 4 промиса:

angular
.module('myApp')
.service('ProductService',
    ['$http','$q', '$filter', '$resource' ,ProductService]);

function ProductService($http,$q,$filter) {

    var self = this;
    //Callable members of this service---------------
    self.getProducts = getProducts;
    self.getVendors = getVendors;
    self.getCategories = getCategories;
    self.getAllData = getAllData;
    self.getInventory = getInventory;
    //---------------//---------------//---------------

function getProducts() {
    var d = $q.defer();
    $http({method : 'GET', url : GET_PRODUCTS_URL})
    .then(function(response) {
        d.resolve(response.data);
    },function (error) {
        d.reject(error);
    });
    return d.promise;
}

function getVendors() {
    var d = $q.defer();
    $http({method : 'GET', url : GET_VENDORS_URL})
    .then(function(response) {
        d.resolve(response.data);
    },function (error) {
        d.reject(error);
    });
    return d.promise;
}

function getCategories() {
    var d = $q.defer();
    $http({method : 'GET', url : GET_CATEGORIES_URL})
    .then(function(response) {
        d.resolve(response.data);
    },function (error) {
        d.reject(error);
    });
    return d.promise;
}

function getInventory() {
    var d = $q.defer();
    $http({method : 'GET', url: GET_ON_HAND_URL})
    .then(function(response) {
        d.resolve(response.data);
    },function(error) {
        d.reject(error);
    });
    return d.promise;
}

function getAllData() {
    var promises = [];
    promises.push(self.getCategories());
    promises.push(self.getVendors());
    promises.push(self.getProducts());
    promises.push(self.getInventory());
    return $q.all(promises);
}
}

Проблема:

По какой-то причине отдельные HTTP-запросы иногда возвращаются неполными, и я также каким-то образом получаю Неожиданные ошибки токена, где закрывающая скобка ] из части запроса $http каким-то образом остается позади. Очень странный. Я уверен, что ответ JSON правильный. Вот пример URL-адреса запроса:

http://jadran.sdsu.edu/jadrn002/servlet/surfing/data?action=vendor

Что может быть причиной такого поведения?


person Guillermo Alvarez    schedule 11.04.2016    source источник
comment
Вероятно, это не связано, но ваша аннотация DI '$http','$q', '$filter', '$resource' не соответствует аргументам вашей функции $http,$q,$filter   -  person Phil    schedule 11.04.2016
comment
Я собирался попробовать использовать директиву ngResource, но в итоге не стал ее использовать.   -  person Guillermo Alvarez    schedule 11.04.2016
comment
Единственное, что я могу отметить в настоящее время, это то, что вы реализовали отложенный антишаблон. Загляните в консоль Network вашего браузера, чтобы просмотреть данные запроса и ответа.   -  person Phil    schedule 11.04.2016
comment
могу я спросить, почему вы откладываете запросы? и почему вы вызываете внутреннюю функцию с помощью self.func?   -  person thegio    schedule 11.04.2016
comment
Я откладываю запросы, потому что именно так документация описывает, как это сделать, но теперь, прочитав полезный комментарий от @Phil, я многому научился и переписал его, чтобы не использовать отложенный анти-шаблон.   -  person Guillermo Alvarez    schedule 11.04.2016


Ответы (1)


Следуя предложениям комментаторов, я переписал весь сервис, чтобы не использовать отсрочку, и это намного лучше. Это новая версия:

angular
    .module('myApp')
    .factory('ProductService',
        ['$q', '$filter', '$resource' ,ProductService]);

function ProductService($q,$filter, $resource) {

     return $resource(API_URL, 
         {}, { 
             products: { method: 'GET', params: { action: 'product'}, isArray: true},
             vendors: { method: 'GET', params: { action: 'vendor'}, isArray: true},
             categories: { method: 'GET', params: { action: 'category'}, isArray: true},
             inventory: { method: 'GET', params: { action: 'on_hand'}, isArray: true},
         }
     );

}

Все они включают свойство $promise, поэтому я могу вызвать следующее:

$q.all([
  ProductService.categories().$promise,
  ProductService.vendors().$promise,
  ProductService.products().$promise,
  ProductService.inventory().$promise
  ])
.then(updateModelWithData)
.catch(function (error) {
  console.log('There was an error fetching data:');
  console.log(error);
});

Мне потребовалось много времени, чтобы понять это, но я, наконец, понял.

В качестве примечания, я не осознавал этого раньше, но у меня были проблемы на стороне сервера, когда одновременные запросы смешивались, и ответ был неправильным. Я исправил обе проблемы сейчас. Спасибо вам за ваши предложения.

person Guillermo Alvarez    schedule 11.04.2016