@ignat07

Как получить данные через ajax?

Здравствуйте, у меня есть база данных с таблицей , в которой большой объем данных . При запросе к миллиону записей у меня не справляется сервер. Потому я решил загружать обрабатывать данные по порциям, например по 10 тысяч каждая. Данные получаются в ajax и выводятся на страничку. Объем данных регулируется skip и limit в запросе . Мне нужно как то сделать условно 10 ajax запросов, чтобы по итогу получилась одна общая data. Мне посоветовали сделать это через promise. Я только не знаю, как сделать ,чтобы задачки выполнялись по очереди с изменяющимся skip , который передается в запрос. Пока получилось так
$.ajax(
        {
            url: urlToCreated + '/' + id,
            type: 'GET',
            dataType: 'json',
            data: {skip: skip, limit: 100000},
        }
    ).promise().then(function (data) {
    })

подскажите, как сделать 10 таких запросов, с меняющимся на каждой итерации skip
  • Вопрос задан
  • 148 просмотров
Решения вопроса 1
teknik2008
@teknik2008
Расскажите про GOLANG. Мне интересно
Вот как можно отправить по очереди запросы с помощью промисов по очереди
var promise = Promise.resolve();
var result = []
for(let i =0; i< 3;i++){
promise = promise.then(()=> $.ajax(
        {
            url: urlToCreated + '/' + id,
            type: 'GET',
            dataType: 'json',
            data: {skip: skip, limit: 100000},
        }
    ).promise().then(function (data) {
  result.push(data)
    }))
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
BRAGA96
@BRAGA96
Вот хороший пример на es5, без Promise и async/await если Вам это важно:
var result = {};

deferredParallel([1, 2, 3, 4, 5], function (id) {
    return $.ajax({
        url: urlToCreated + '/' + id,
        method: 'GET',
        dataType: 'json',
        data: {
            skip: skip,
            limit: 100000
        },
        success: function (data) {
            result[id] = data;
        }
    });
}).done(function () {
    console.log(result);
});

function deferredParallel(items, callback) {
    var deferreds = [];
    for (var i = 0; i < items.length; i++) {
        var deferred = callback(items[i], i, items);
        if (typeof deferred === 'object' && deferred.done && deferred.fail) {
            deferreds.push(deferred);
        }
    }
    return $.when.apply(null, deferreds);
}


А вот рабочий пример, который вы можете запустить в консоли, например даже тут на тостере:
var result = [];

deferredParallel([1, 2, 3, 4, 5], function (item) {
    return $.ajax({
        url: 'https://jsonplaceholder.typicode.com/posts/' + item,
        method: 'GET',
        dataType: 'json',
        success: function (data) {
            result.push(data);
        }
    });
}).done(function () {
    console.log(result);
});

function deferredParallel(items, callback) {
    var deferreds = [];
    for (var i = 0; i < items.length; i++) {
        var deferred = callback(items[i], i, items);
        if (typeof deferred === 'object' && deferred.done && deferred.fail) {
            deferreds.push(deferred);
        }
    }
    return $.when.apply(null, deferreds);
}


Пример выше делал запросы паралельно, в network это выглядит так:
▮▮▮▮
▮▮▮▮
▮▮▮▮
□□□□□□ READY

Следующий пример последовательный:
▮▮▮
□□□□□▮▮▮
□□□□□□□□□□▮▮▮
□□□□□□□□□□□□□□□ READY
var result = [];

deferredQueue([1, 2, 3, 4, 5], function (item) {
    return $.ajax({
        url: 'https://jsonplaceholder.typicode.com/posts/' + item,
        method: 'GET',
        dataType: 'json',
        success: function (data) {
            result.push(data);
        }
    });
}).done(function () {
    console.log(result);
});

function deferredQueue(items, callback) {
    var ready = $.Deferred();
    ;(function fire (i) {
        var deferred = callback(items[i], i, items);
        if (typeof deferred === 'object' && deferred.done && deferred.fail) {
            deferred.done(function () {
                items[i + 1] ? fire(++i) : ready.resolve();
            });
        }
    }(0));
    return ready;
}
Ответ написан
Kozack
@Kozack
Thinking about a11y
В вашем случае нужно использовать выражение async/await в цикле; Так каждый следующий запрос будет ожидать завершение предыдущего
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы