Здравствуйте, уважаемые программисты!
У меня на сайте просмотр гиф изображений реализуется кнопкой воспроизведения/остановки.
Т.е, изначально пользователю отображается статический кадр (сохраненный за ранее). Он нажимает кнопку воспроизведения. К серверу отправляется ajax запрос на скачивание файла, а пользователь видит прогресс-бар. В случае успешной загрузки подменяется статичный кадр на гифку. Потом можно остановить ее и снова появится статичный кадр. Если пользователь во время загрузки передумал, загружать, то просто нажимает повторно и процесс убивается ajaxCall.abort();
Все бы ничего, но на странице может быть много гифок и если пользователь "поставит на загрузку" несколько, сразу то к первому он уже не сможет обратиться, чтобы остановить.
Вот собственно и вопрос, а могу ли я как-то сохранять информацию о всех запущенных запросах и отменять именно тот, на котором нажали кнопку отмены?
Спасибо. Посмотрел. Пока не очень могу понять как там убить конкретный запрос. И откуда контроллер знает о всех возможных запросах и как обращаться к конкретному из них
Александр, При клике "загрузить " создавайте новый контроллер, делайте запрос, в signal которого будет указать конкретный контроллер(который только что создали), а при отмене загрузки пользователем - делайте аборт контроллером, который создали при загрузке. Тогда он отменит соответствующий запрос.
Видимо структуру я до конца не понимаю. Контроллер создам. Но, пользователь ставит на загрузку 3 гифки и что? Три раза создаётся контроллер с одним и тем же именем? И как тогда отменить загрузку одной из трех гифок, к примеру?
Александр, ну тут уже Вам решать как запомнить за какой "гифкой" какой контроллер.
Я, как минимум, не вижу ни структуры ни подхода к обработке событий.
Но основных вариантов, как мне видится, 3:
1) Для каждой гифки будет свой объект, в котором хранится контроллер, и методы для отправки\отмены запроса. Соответственно, кнопки "загрузить" и "отменить" дёргают соответствующие методы.
2) Можно сохранять контроллер в кастомное свойство конкртеного html элемента. А в обработчике проверять\использовать это свойство.
3) Можно сделать объект Map, в котором свойством будут выступать, скажем, гифки(их адреса или конкретные html элементы), а значения - их контроллер. И тогда в обработчиках "Загрузить"\ "отменить" смотреть в этот Map и работать с контроллерами.
Александр, а, ну Вам не нужен нативный abort controller. Просто Вам нужно запоминать $.ajax для каждого элемента, по любому из вышеописанных мною вариантов. Например вариант 2 или 3.
В коде у Вас уже есть проверки что нажали. Загрузить или отменить. Соответственно, при "загрузить" запоминаете $.ajax, при "отменить" - считываете его и вызываете .abort()
Александр, jQuery.ajax возвращает Deffered объект. Аналог промисов в js.
Вы, собственно, уже его запоминаете ajaxCall = $.ajax({...}).
Осталось запоминать не один единственный во внешней переменной, а для каждой гифки - свой.
Как я описал выше. Например, вобъекте, где свойством будет адрес гифки, а значением - deffered объект ajax запроса.
Например:
Не важно на что идёт ссылка, я так понимаю вопрос был в том как управлять Ajax запросом, причём асинхронно. Где хранить информацию о запросах. На это и был дан ответ.