05.02.2020, 19:47
|
Аспирант
|
|
Регистрация: 19.11.2010
Сообщений: 48
|
|
Вызов функции до тех пор, пока она возвращает true
Добрый день.
Прошу не судить меня строго, но не могу понять и найти в нете решение моей проблемы.
Подключена jQuery.
Есть событие, например клик по ссылке. По этому событию срабатывает функция, пусть она func1.
Внутри нее нужно сделать так, что вызывается функция func2, которая может вернуть либо true, либо false.
Так вот, как сделать чтобы внутри func1 вызывалась func2 до тех пор, пока func2 возвращает true? Как только вернула false, больше она не вызывается, всё останавливается, может выводится пользователю сообщение или ещё что-то.
Вариант с setTimeout не подойдет, так как func2 может выполняться неопределенное время (там ajax-ом отправляются данные и ждется ответ сервера после определенной работы), поэтому нужно отслеживать именно ответ и в случае если он true, то запускать ее снова.
Надеюсь что смог объяснить свою мысль, вот только решения не могу подобрать.
Сможете дать совет?
Заранее благодарю.
|
|
05.02.2020, 20:07
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Сообщение от Lion_astana
|
Сможете дать совет?
|
Можно и синхронно выполнить запрос, то есть браузер и будет ожидать ответа от севера и функций никаких не надо, но это подвесить браузер, так как ничего иного выполняться не будет. Вы этого хотите?
|
|
05.02.2020, 20:15
|
Аспирант
|
|
Регистрация: 19.11.2010
Сообщений: 48
|
|
Сообщение от laimas
|
Можно и синхронно выполнить запрос, то есть браузер и будет ожидать ответа от севера и функций никаких не надо, но это подвесить браузер, так как ничего иного выполняться не будет. Вы этого хотите?
|
Нет. Запросы AJAX выполняются асинхронно. Пользователь этого не ощущает. Т.е. отправился запрос, ждём ответ. Интерпритируем ответ в формате json: если пришло одно, то return true, а если другое, то return false. А уже из возвращаемого функцией результата решаем, запускать её еще раз или нет.
|
|
05.02.2020, 21:07
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Сообщение от Lion_astana
|
Т.е. отправился запрос, ждём ответ.
|
Вы его лично жать собираетесь? Как только будет получен ответ, то будет выполнена функция объявленная в success, получайте json, используйте, зачем какую-то функцию гонять по кругу?
|
|
05.02.2020, 21:17
|
Аспирант
|
|
Регистрация: 19.11.2010
Сообщений: 48
|
|
Думаю как организовать импорт товаров компании из YML файла. Объем большой, более 35 000 товаров.
Есть кнопка "Начать импорт" и поле для ссылки на файл.
После нажатия кнопки PHP забирает cURL- ом файл, разбирает и начинает грузить в базу строки, в директорию фото. Всё гуд, но сервак прерывал соединение. Я увеличил время в NGINX до пол часа на соединение, но оказалось что и пол часа мало, успело импортироваться 7500 товаров.
Вот и думаю теперь такой вариант: YML разбирается, превращается в массив, сжимаем его, превращаем в строку и записываем в .txt файл на первом этапе, когда пользователь нажимает на "Загрузить файл". В этом случае ему выходит ответ: "Файл загружен на сервер и готов к импорту. Товаров - n." и ниже кнопка "Начать импорт". Вот тут и думаю сделать функцию в JS, которая даст по нажатию на кнопку запуск другой функции, которая запустит импорт на PHP. PHP вытащит из текстового файла строку, разожмёт и превратит обратно в массив. Пройдет по массиву, например 1000 раз, импортирует, а затем удалит из массива импортированный товар, посчитает сколько осталось товаров после импорта 1000 и вернет ответ в нашу функцию JS. Функция посмотрит сколько товаров осталось и решит, запустить ли еще раз импорт. Если > 0 , то снова вызовет функцию, которая стартанет PHP еще раз и т.д.
Т.е. нужно организовать импорт любого количества товаров частями, не грузя сервер без остановки.
Блин, может бредово написал, но уже не знаю как извернуться.
|
|
05.02.2020, 21:22
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Сообщение от Lion_astana
|
После нажатия кнопки PHP забирает cURL- ом файл, разбирает и начинает грузить в базу строки
|
А какое отношение к этому имеет клиент или вы даете команду на импорт и ждете у экрана когда закончится?
Вообще такие операции вешают на Планировщика задач.
|
|
05.02.2020, 21:42
|
Аспирант
|
|
Регистрация: 19.11.2010
Сообщений: 48
|
|
Пользователь видит loader и надпись "Импортировано n товаров". Другая функция каждые 5 секунд проверяет количество импортированных товаров в БД и возвратив это значение подставляет вместо n.
Если пользователь покинет страницу, то импорт очередного количества товаров завершится и без него. Во время импорта в БД в таблице будет флаг, которые не даст показать снова кнопку "Импортировать", если пользователь покинет страницу и вновь вернётся.
Видел что можно через планировщик это делать, но как-то это не совсем живо. Так пользователь будет видеть процесс в живую, здесь и сейчас.
|
|
05.02.2020, 21:52
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Сообщение от Lion_astana
|
Пользователь видит loader и надпись "Импортировано n товаров".
|
Если вы для каждого пользователя будет делать то, что описываете, то это скорее всего закончится тем, что другим пользователям сервер будет отвечать статусом 500.
С досками объявлений знакомы? Как они работают - ваша задача приготовить файл экспорта определенного формата и указать на доске путь к нему. Визуально его могут просмотреть только для того, чтобы, к примеру как у Яндекса, отклонить так как его содержание не соответствует их понятиям чести. Все остальное это машина, и проверит фал на ошибки, выдав отчет, и заберет его для импорта. Но делать она это будет не тогда когда вам хочется, а по расписанию, ибо не вы один у них.
Если вам экспортируют с локальных машин, значит задача пользователя только загрузить файл. А далее у вас в базе должна быть таблица задач, в которой каждая задача планировщику отображается как статус выполнения, как выполнена и прочее, и прочее. Вот в своем личном кабинете пусть и наблюдают. Не сложно и извещение почтой или иным путем прислать.
Выполнять импорт загруженных файлов планировщику, причем запускать его во время когда сайт имеет меньшую нагрузку, статистику для этого вести надо.
|
|
05.02.2020, 21:55
|
Аспирант
|
|
Регистрация: 19.11.2010
Сообщений: 48
|
|
Сейчас в голову пришла такая мысль: может по клику запускать функцию, в которой через timeout каждые 10 секунд проверяется определенный атрибут, например data-atribut у кнопки. Если он == 0, значит запустить импорт и сменить его значение на 1. Если 1, то ничего не делать. Если == 2, то импорт завершён. Функция, которая ждет ответ от PHP будет его проверять, если есть ещё товары, то поменяет по окончании загрузки очередной партии товаров data-atribut на 0, если ответ скажет о том, что загружены все товары, то сменит его на 2.
Костыльно немного, но думаю сработает. Что скажете?
|
|
05.02.2020, 21:56
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Сообщение от Lion_astana
|
Что скажете?
|
Я уже сказал, а далее делайте как считает нужным.
|
|
|
|