waLongActionController объясните плиз =))

BNP (Дмитрий)

Коллеги, расскажите плиз на пальцах, как сия штука работает?

Что отправляем из js, что получаем в пыхе.

Смотрю здесь изучаю сам класс, но все-равно присутствует некоторое непонимание =( А пользовать надо, т.к. есть задачи, которые не вписываются в стандартные 30 сек =(

2 февраля 2016
  • Syrnik.com 2 февраля 2016 14:13

    В js крутится опрашивалка статуса. при старте она получает уникальный номер задачи и каждые 5 (или сколько там настроишь setTimeout) секунд генерит запрос состояния с этим самым номером. Как только поллучает сигнал о том, что все выполнено, показывает статистику и перестает генерить запросы.

    У waLAC есть несколько обязательных методов. Пишу по памяти, могу что-то упустить.

    • init срабатывает один раз при запуске (это когда ты стартуешь без номера задачи).
    • step вызывается на каждый шаг. Очень желательно, чтобы step выполнялся за разумное время и не умирал по таймауту
    • finish вызывается, если все сделано.

    т.е. init-step-step-step-finish

    чтобы сохранять данные между запусками у контроллера есть свойство data. Туда складываешь все, что нужно, чтобы хранилось :) номер строчки, на которой остановилась обработка csv, количество товаров, уже выгруженных в yml... Все, что туда складывается должно уметь сериализоваться -- т.е. если ты туда свой объект складываешь, он должен реализовывать интерфейс соответствующий (для простых типов это не нужно, оно само умеет). Соответственно в контроллере есть два метода, которые сериализуют и десереиализуют все это.

    Ну вот так вот в общих чертах. Там есть еще всякие нюансы, например контроллер умеет сообщать, что эта задача сейчас выполняется --- в штатных js-скриптах крутится 2 цикла опроса. Один запускается реже -- он ждет выполнения очередного step, второй чаще -- он просто опрашивает состояние и обновляет прогрессбар. Но можно обойтись и одним циклом, не заморачиваясь.

  • waResearchLab 2 февраля 2016 14:51

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

  • BNP (Дмитрий) 2 февраля 2016 17:38

    Спасибо, ребята ... буду изучать =))

  • ITFrogs 2 февраля 2016 18:31

    Самый сложнопонимаемый контроллер из всех. Чтобы разобраться я сначала выпилил из него stage. Стало гораздо проще.

    Спасибо Сергею Родовниченко за терпеливое разъяснение.

  • BNP (Дмитрий) 3 февраля 2016 10:47

    Кажется разобрался слегка.

    Только вот не совсем понял, почему первый ответ от контроллера приходит только через 12 секунд, хотя опрашиваю каждые 2 секунды (для тестов)?

    time: "0:00:12", processId: "56b21f0cb5c8f", progress: "100,000%", ready: true, offset: 10…
  • waResearchLab 3 февраля 2016 11:56

    Ну навскидку:

    • это все же не первый ответ :) Уверен что первый?
    • за один step обрабатывается весь массив данных. хотя, тоже предположение так себе...
  • Syrnik.com 3 февраля 2016 12:05

    Если ты через setTimeout то там такая петрушка:

    ждем 2 сек → делаем запрос → ждем ответа → ждем 2 сек → делаем запрос...

    там же следующий setTimeout генерится при получении ответа от $.ajax ($.get/$.post)... :)

    поэтому webasyst в своих плагинах импорта делает 2 цикла. если первый ждет ответа, второй просто получает статистику. и наоборот, если случилось так, что второй сделал запрос и ждет, то тогда первый просто получает ответ "все работает, обработано столько-то"

    но я бы на начальном этапе не стал вот эту конструкцию воспроизводить. разберись сначала, как работает самая простая минимально-рабочая конфигурация

  • BNP (Дмитрий) 3 февраля 2016 12:29

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

    Но я все-равно не понимаю. Я же опрашиваю каждые 2 секунды, а шаг исполняется за 12.

    Т.е. получается действительно надо крутить два цикла, как предлагает Сергей?



Чтобы добавить комментарий, зарегистрируйтесь или войдите