Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 05.02.2020, 19:47
Аспирант
Отправить личное сообщение для Lion_astana Посмотреть профиль Найти все сообщения от Lion_astana
 
Регистрация: 19.11.2010
Сообщений: 48

Вызов функции до тех пор, пока она возвращает true
Добрый день.

Прошу не судить меня строго, но не могу понять и найти в нете решение моей проблемы.

Подключена jQuery.

Есть событие, например клик по ссылке. По этому событию срабатывает функция, пусть она func1.

Внутри нее нужно сделать так, что вызывается функция func2, которая может вернуть либо true, либо false.

Так вот, как сделать чтобы внутри func1 вызывалась func2 до тех пор, пока func2 возвращает true? Как только вернула false, больше она не вызывается, всё останавливается, может выводится пользователю сообщение или ещё что-то.

Вариант с setTimeout не подойдет, так как func2 может выполняться неопределенное время (там ajax-ом отправляются данные и ждется ответ сервера после определенной работы), поэтому нужно отслеживать именно ответ и в случае если он true, то запускать ее снова.

Надеюсь что смог объяснить свою мысль, вот только решения не могу подобрать.

Сможете дать совет?
Заранее благодарю.
Ответить с цитированием
  #2 (permalink)  
Старый 05.02.2020, 20:07
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от Lion_astana
Сможете дать совет?
Можно и синхронно выполнить запрос, то есть браузер и будет ожидать ответа от севера и функций никаких не надо, но это подвесить браузер, так как ничего иного выполняться не будет. Вы этого хотите?
Ответить с цитированием
  #3 (permalink)  
Старый 05.02.2020, 20:15
Аспирант
Отправить личное сообщение для Lion_astana Посмотреть профиль Найти все сообщения от Lion_astana
 
Регистрация: 19.11.2010
Сообщений: 48

Сообщение от laimas Посмотреть сообщение
Можно и синхронно выполнить запрос, то есть браузер и будет ожидать ответа от севера и функций никаких не надо, но это подвесить браузер, так как ничего иного выполняться не будет. Вы этого хотите?
Нет. Запросы AJAX выполняются асинхронно. Пользователь этого не ощущает. Т.е. отправился запрос, ждём ответ. Интерпритируем ответ в формате json: если пришло одно, то return true, а если другое, то return false. А уже из возвращаемого функцией результата решаем, запускать её еще раз или нет.
Ответить с цитированием
  #4 (permalink)  
Старый 05.02.2020, 21:07
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от Lion_astana
Т.е. отправился запрос, ждём ответ.
Вы его лично жать собираетесь? Как только будет получен ответ, то будет выполнена функция объявленная в success, получайте json, используйте, зачем какую-то функцию гонять по кругу?
Ответить с цитированием
  #5 (permalink)  
Старый 05.02.2020, 21:17
Аспирант
Отправить личное сообщение для Lion_astana Посмотреть профиль Найти все сообщения от Lion_astana
 
Регистрация: 19.11.2010
Сообщений: 48

Думаю как организовать импорт товаров компании из YML файла. Объем большой, более 35 000 товаров.

Есть кнопка "Начать импорт" и поле для ссылки на файл.

После нажатия кнопки PHP забирает cURL- ом файл, разбирает и начинает грузить в базу строки, в директорию фото. Всё гуд, но сервак прерывал соединение. Я увеличил время в NGINX до пол часа на соединение, но оказалось что и пол часа мало, успело импортироваться 7500 товаров.

Вот и думаю теперь такой вариант: YML разбирается, превращается в массив, сжимаем его, превращаем в строку и записываем в .txt файл на первом этапе, когда пользователь нажимает на "Загрузить файл". В этом случае ему выходит ответ: "Файл загружен на сервер и готов к импорту. Товаров - n." и ниже кнопка "Начать импорт". Вот тут и думаю сделать функцию в JS, которая даст по нажатию на кнопку запуск другой функции, которая запустит импорт на PHP. PHP вытащит из текстового файла строку, разожмёт и превратит обратно в массив. Пройдет по массиву, например 1000 раз, импортирует, а затем удалит из массива импортированный товар, посчитает сколько осталось товаров после импорта 1000 и вернет ответ в нашу функцию JS. Функция посмотрит сколько товаров осталось и решит, запустить ли еще раз импорт. Если > 0 , то снова вызовет функцию, которая стартанет PHP еще раз и т.д.

Т.е. нужно организовать импорт любого количества товаров частями, не грузя сервер без остановки.

Блин, может бредово написал, но уже не знаю как извернуться.
Ответить с цитированием
  #6 (permalink)  
Старый 05.02.2020, 21:22
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от Lion_astana
После нажатия кнопки PHP забирает cURL- ом файл, разбирает и начинает грузить в базу строки
А какое отношение к этому имеет клиент или вы даете команду на импорт и ждете у экрана когда закончится?
Вообще такие операции вешают на Планировщика задач.
Ответить с цитированием
  #7 (permalink)  
Старый 05.02.2020, 21:42
Аспирант
Отправить личное сообщение для Lion_astana Посмотреть профиль Найти все сообщения от Lion_astana
 
Регистрация: 19.11.2010
Сообщений: 48

Пользователь видит loader и надпись "Импортировано n товаров". Другая функция каждые 5 секунд проверяет количество импортированных товаров в БД и возвратив это значение подставляет вместо n.

Если пользователь покинет страницу, то импорт очередного количества товаров завершится и без него. Во время импорта в БД в таблице будет флаг, которые не даст показать снова кнопку "Импортировать", если пользователь покинет страницу и вновь вернётся.

Видел что можно через планировщик это делать, но как-то это не совсем живо. Так пользователь будет видеть процесс в живую, здесь и сейчас.
Ответить с цитированием
  #8 (permalink)  
Старый 05.02.2020, 21:52
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от Lion_astana
Пользователь видит loader и надпись "Импортировано n товаров".
Если вы для каждого пользователя будет делать то, что описываете, то это скорее всего закончится тем, что другим пользователям сервер будет отвечать статусом 500.

С досками объявлений знакомы? Как они работают - ваша задача приготовить файл экспорта определенного формата и указать на доске путь к нему. Визуально его могут просмотреть только для того, чтобы, к примеру как у Яндекса, отклонить так как его содержание не соответствует их понятиям чести. Все остальное это машина, и проверит фал на ошибки, выдав отчет, и заберет его для импорта. Но делать она это будет не тогда когда вам хочется, а по расписанию, ибо не вы один у них.

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

Выполнять импорт загруженных файлов планировщику, причем запускать его во время когда сайт имеет меньшую нагрузку, статистику для этого вести надо.
Ответить с цитированием
  #9 (permalink)  
Старый 05.02.2020, 21:55
Аспирант
Отправить личное сообщение для Lion_astana Посмотреть профиль Найти все сообщения от Lion_astana
 
Регистрация: 19.11.2010
Сообщений: 48

Сейчас в голову пришла такая мысль: может по клику запускать функцию, в которой через timeout каждые 10 секунд проверяется определенный атрибут, например data-atribut у кнопки. Если он == 0, значит запустить импорт и сменить его значение на 1. Если 1, то ничего не делать. Если == 2, то импорт завершён. Функция, которая ждет ответ от PHP будет его проверять, если есть ещё товары, то поменяет по окончании загрузки очередной партии товаров data-atribut на 0, если ответ скажет о том, что загружены все товары, то сменит его на 2.

Костыльно немного, но думаю сработает. Что скажете?
Ответить с цитированием
  #10 (permalink)  
Старый 05.02.2020, 21:56
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от Lion_astana
Что скажете?
Я уже сказал, а далее делайте как считает нужным.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вызов вложенной функции объявленной без ключевого слова var ytil Общие вопросы Javascript 6 15.10.2018 22:53
Вызов функции pokk Общие вопросы Javascript 1 29.01.2018 12:38
Динамическое подключение JS и вызов функции Paqwerty Events/DOM/Window 1 25.04.2017 16:33
Вызов функции страницы из расширения chrome nontxt Events/DOM/Window 0 09.02.2015 10:42
Двойной вызов функции Tmin10 jQuery 8 08.12.2011 15:19