Как ждать в Rails, не блокируя основной поток? - PullRequest
0 голосов
/ 03 апреля 2019

У меня есть приложение Rails, которое я разрабатываю так, что, когда пользователи завершают платеж, они будут перенаправлены на представление, скажем, в контроллере А. Используемый мной API платежа также хочет, чтобы мы реализовали URL-адрес обратного вызова, который обслуживается действием в контроллере B (при этом в базе данных будет установлен статус оплаты «оплачен», когда платежный шлюз отправляет запрос POST на указанный URL-адрес). Что я хочу знать, так это как написать цикл while для действия перенаправления в контроллере A, чтобы проверить, было ли установлено состояние оплаты «оплачено» без блокировки основного потока? Когда я тестировал мое приложение, консоль сервера показала, что инициирован запрос POST, но основной поток блокируется циклом while при перенаправлении, поэтому мое приложение оказалось в бесконечном цикле. Я пытался использовать Ruby Threads, но я не могу понять это.

Ответы [ 2 ]

0 голосов
/ 03 апреля 2019

Вы можете думать о работающем приложении Rails как о гигантском цикле while: ждать запросов, получать запрос, обрабатывать запросы, ждать следующего запроса. Похоже, ваш платежный процессор спроектирован так, чтобы красиво интегрироваться с этой архитектурой, предоставляя вам возможность указать URL-адрес обратного вызова (например, ваше приложение отображает веб-крюк) в контроллере B. Если вы заблокируете этот цикл, ваше приложение перестанет отвечать на новые запросы.

Я так понимаю, ваш вопрос о том, как обновить пользователя. После того как пользователь завершил платеж, стандартным является перенаправление его на страницу, доступную по запросу GET, чтобы при обновлении браузера не повторная отправка платежа (возможно, POST). Давайте представим, что это действие «показать заказ», которое включает статус платежа как «ожидающий» или «обработанный». Когда пользователь впервые видит страницу, он показывает статус: в ожидании. Позже, после того, как обработчик платежей выполнит обратный вызов в контроллере B, если пользователь заходит на ту же страницу или обновляет ее в своем браузере, он должен показать статус: обработано.

Если вы хотите, чтобы страница обновлялась самостоятельно, вы обычно делаете это с помощью опроса в javascript. Вы можете представить JSON-ответ от того же действия (или нового действия, которое просто возвращает статус оплаты заказа), а затем создать цикл, выполняющийся в javascript, в браузере, который выполняет это действие каждые несколько секунд, чтобы увидеть, изменился ли статус, затем конец, когда это имеет. Подумайте об использовании экспоненциального спада для быстрого обновления состояния в обычном случае, когда это происходит спустя несколько мгновений, но во избежание слишком большого числа запросов на сервер, если это занимает минуты или часы.

0 голосов
/ 03 апреля 2019

Вам не нужен контроллер А, чтобы ждать.Зачем?Обработка платежа может занять от нескольких секунд до нескольких часов.Ожидаете ли вы, что пользователь будет сидеть и наблюдать за счетчиком «загрузки страницы»?

Вместо этого вы продвигаете процесс в контроллере обратного вызова шлюза оплаты (установите статус «оплачено», отправьте электронное письмо пользователю и начнете доставлять товар).).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...