Javascript-форум (https://javascript.ru/forum/)
-   Javascript под браузер (https://javascript.ru/forum/css-html/)
-   -   Как выполнить что-нибудь после серии ajax запросов (https://javascript.ru/forum/css-html/80532-kak-vypolnit-chto-nibud-posle-serii-ajax-zaprosov.html)

AxMuha 17.06.2020 15:00

Как выполнить что-нибудь после серии ajax запросов
 
Извините, наверное, чайниковский вопрос...

Мне нужно сделать серию ajax запросов, а после того, как все они будут выполнены, выполнить следующий код.
Что-то не соображу, как это реализовать..

Пример:
let invoiceIds = [];
                $(".chkInvoice").each(function () {
                    
                    if ($(this).is(':checked')) {
                        let route = $(this).attr("route");
                        let driver = $(this).attr("driver");
                        let deliveryDate = $(this).attr("deliveryDate");
                        $.getJSON(`/myApi?route=${route}&driver=${driver}&deliveryDate=${deliveryDate}`, function (data) {
                            for (let invoice of data.Invoices) {
                                if (invoice.Status.toLowerCase() == "completed") invoiceIds.push(invoice.Id);
                            }
                        });
                    }
                });


Выше выполнение серии запросов (для каждого селектора) и только после выполнения всех запросов я должен что-нибудь сделать с массивом номеров счетов (invoiceIds)

Куда запрягать? :)

laimas 17.06.2020 15:09

А сервер не может вернуть все записи диапазона от deliveryDate1 до deliveryDate2?

AxMuha 17.06.2020 15:27

:) Сервер многое что может.. Вопрос же не в этом. А как в принципе решаются такие задачи?

Цитата:

Сообщение от laimas (Сообщение 526019)
А сервер не может вернуть все записи диапазона от deliveryDate1 до deliveryDate2?


AxMuha 17.06.2020 15:32

Мне в голову приходит только вариант выполнять ajax запросы синхронно

laimas 17.06.2020 16:05

Цитата:

Сообщение от AxMuha
А как в принципе решаются такие задачи?

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

Что такое deliveryDate? Если нужно запросить сервер по ряду конкретных значений, значит нужно отправить ему массив этих значений, а если диапазон, то два значения - мин/макс.

Если это параметры запроса к базе и это массив значений, то это будет один запрос к базе как WHERE field_name IN(N1, N2, N3, ..., Nn), если диапазон, то WHERE field_name BETWEEN N1 AND N2.

Вот так делается - один запрос клиента, один ответ сервера и разбор данных сервера в цикле. Это рациональнее и выгоднее, чем насиловать и клиента, и сервер множественными запросами, да если еще в один момент времени это будут делать множество клиентов.

AxMuha 17.06.2020 19:12

Спасибо, что хотите мне помочь. Но ситуации бывают разные, меня сейчас интересует вопрос по java script.
Синхронный вариант работает, но блокирует основной поток, что плохо.
У меня возникла идея, что можно сначала посмотреть, посмотреть, сколько элементов нужно будет обойти. Установить переменную с этим значением и в каждом вызове функции вычитать единичку. И соответственно проверять, как дошли до нуля - значит последний вызов и можно дернуть callback.
Но выглядит это все как-то не надежно...

Цитата:

Сообщение от laimas (Сообщение 526024)
В принципе гонять в цикле запросы к серверу, это плохо,


рони 17.06.2020 19:38

AxMuha,
https://learn.javascript.ru/promise

laimas 17.06.2020 19:47

Цитата:

Сообщение от AxMuha
У меня возникла идея

А других идей нет? :) Я ведь тоже говорю о JS, только не

$(".chkInvoice").each(function () {
    if ($(this).is(':checked')) {


а

$.map($(".chkInvoice:checked"), function ... //вернет массив значения выбранных флажков


Затем передать его асинхронным запросом на сервер, а далее сделать один надлежащий запрос к базе и вернуть также только то что нужно - индексный массив значений ID, то есть и этого не потребуется на клиенте:

if (invoice.Status.toLowerCase() == "completed") invoiceIds.push(invoice.Id);


у вас уже будет готовый массив, используйте.

Кроме этого сервер и при формировании страницы его может прописать эти данные в тело ее как js-объект и вообще запроса не потребуется. Вы что к серверу доступа не имеете или какая проблема, почему такими граблями пытаетесь решать задачу?

AxMuha 18.06.2020 08:45

Спасибо, Рони.
Похоже, это как раз то, что мне нужно

Цитата:

Сообщение от рони (Сообщение 526029)



Часовой пояс GMT +3, время: 16:18.