Angularjs несколько запросов HTTP POST, вызывающих net :: ERR_INSUFFICIENT_RESOURCES - PullRequest
0 голосов
/ 14 февраля 2020

В моем приложении я получаю список хостов, предоставленных пользователем, в форме поля textarea и вставляю их в мою базу данных, используя HTTP POST to API.

Все работает нормально, пока список не превышает 2,5 тыс. Хостов, когда я получаю ошибку net :: ERR_INSUFFICIENT_RESOURCES . Я читал, что это связано с некоторыми Chrome ограничениями.

Как мне преодолеть это ограничение? Я пытался разделить список на группы и ввести некоторую задержку между ними, но это не работает (кажется, что все группы запускаются асинхронно одновременно).

Контроллер:

AddHostsController.$inject = ['$scope', 'Authentication', 'App', 'Hosts', '$filter', '$timeout'];

function AddHostsController($scope, Authentication, App, Hosts, $filter, $timeout) {
    var vm = this;
    vm.submit = submit;
    ...some other staff...

    function submit() {
      var fulllist = [];
      vm.firstbunch = [];
      vm.secondbunch = [];
      fulllist = vm.host_list.split('\n');
      vm.firstbunch = fulllist.slice(0,1500);
      vm.secondbunch = fulllist.slice(1500,);

      $timeout(function() { vm.firstbunch.forEach(submitHost);}, 2000)
      .then(firstBunchSuccessFn, firstBunchErrorFn);

      function firstBunchSuccessFn(){
        vm.secondbunch.forEach(submitHost);
      }

      function firstBunchErrorFn(){
        console.log("Something went wrong!");
      }

      function submitHost(value, index, array){
        App.addhosts(...some args..., value).then(addHostsSuccessFn, addHostsErrorFn);

        function addHostsSuccessFn(response) {
        }

        function addHostsErrorFn(response) {
          console.error('Failure!');
        }
     }
}

Сервис:

.factory('App', App);

App.$inject = ['$http'];

function App($http) {
    var App = {
      addhosts: addhosts,
    };

    return App;

    function addhosts(...some other.., value) {

        return $http.post('/api/v1/hosts/', {
            ...some other...
            value: value
        });
    }

1 Ответ

1 голос
/ 14 февраля 2020

Вместо параллельного выполнения запросов объедините их в цепочку:

var configArr = [/* Array of config objects */];
var resultsArrPromise = configArr.reduce( reducerFn, $q.when([]) );

responseArrPromise
  .then(function (responseArr) {
    responseArr.forEach( response => console.log(response.data) );
}).catch(function (errorResponse) {
    console.log(errorResponse);
}); 

function reducerFn(acc, config) {
    var accArrPromise = acc.then(function(responseArr) {
        var httpPromise = $http(config);
        return $q.all( [...responseArr, httpPromise] );
    });
    return accArrPromise;
}

Редуктор начинается с обещания пустого массива. Каждая итерация редуктора связывает очередное HTTP-обещание с массивом ответов. Результатом является обещание, которое разрешается в массиве ответов. Сцепляя запросы HTTP, они выполняются последовательно, а не параллельно.

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