Рефакторинг похожих ajax-запросов

270
16 ноября 2017, 06:14

Помогите пожалуйста переписать запрос таким образом чтобы не было повторяющихся кусков кода. Мой код для случая 1350 работает, но если городов будет, например, 5350, то код превратится в индусский(не DRY).

$( document ).ready(function() {
    getCities();
    var citiesArr = [];                     
    var citiesArr1 = [];                        
    var citiesArr2 = [];                        
    function getCities() {
        $.ajax({
        url: "http://api.vk.com/method/database.getCities?v=5.69&need_all=0&count=1000&country_id=1&region_id=1052052",
        dataType: "jsonp",
        success: function( data ) {
            // console.log('data', data);
            var allCities = data.response.count;
            console.log('allCities', allCities);
                var citiesRaw = data['response']['items'];
              citiesArr1 = citiesRaw.map(function(city) {
                return city.title;
              });
              //console.log(citiesArr);
              getCities2();
        }           
        });
    };  
    function getCities2() {
        $.ajax({
        url: "http://api.vk.com/method/database.getCities?v=5.69&need_all=0&count=1000&country_id=1&region_id=1052052&offset=1000",
        dataType: "jsonp",
        success: function( data ) {
            // console.log('data', data);
            var allCities = data.response.count;
            console.log('allCities', allCities);
                var citiesRaw = data['response']['items'];
              var citiesArr2 = citiesRaw.map(function(city) {
                return city.title;
              });
              citiesArr = citiesArr1.concat(citiesArr2);
              console.log(citiesArr);
        }           
        });
    };  
});

Как видите, здесь для определённого региона получаю в два этапа список всех городов. Этапа два потому что vk api за один запрос возвращает не более 1000 городов. Хотелось бы более лаконичного решения

Answer 1

Загрузит все города в один массив cities.

    var cities = []
    function getCities( offset, limit ) {
        if( ! limit || limit > 1000 ) limit = 1000; //число запрашиваемых городов, максимально 1000, по умолчанию 1000
        if( ! offset ) offset = 0; //по умолчанию 0
        $.ajax({
        url: "http://api.vk.com/method/database.getCities?v=5.69&need_all=0&count="+limit+"&country_id=1&region_id=1052052&offset="+(offset*limit),
        dataType: "jsonp",
        success: function( data ) {
            // console.log('data', data);
            var allCities = data.response.count;
            console.log('allCities', allCities);
            var citiesRaw = data['response']['items'];
            //с помощью concat можно объеденить 2 массива.
            cities = cities.concat(citiesRaw.map(function(city) {
              return city.title;
            }));
            //если в текущем ответе не все города то делаем ещё запрос с новым offset
            if( allCities > offset*limit + limit)
               getCities(offset+1, limit);
        }           
        });
    };  

Вызывать просто getCities(). Будет грузить все города, сколько бы тысяч их не было.

READ ALSO
Как запустить React на сервере

Как запустить React на сервере

У меня есть фронтенд, часть на реакт и бэкэнд на nodeЯ через ssh загрузил все на сервер

333
как посчитать сумму чисел в промежутке рекурсия js

как посчитать сумму чисел в промежутке рекурсия js

Есть такая функция , как ее модифицировать под 2 значения , чтобы можно была считать от числа num1 к числу num2

604
Объявление функции в setInterval в React

Объявление функции в setInterval в React

Во время изучения React обнаружил следующий код:

345
RegExp валидность URL

RegExp валидность URL

Ребята, что нужно дописать, что бы передача параметров не могла начинаться с &, как во втором примере?

279