2017-02-18 4 views
-1

Предположим, я отредактировал свое имя в разделе «Альфа», «Бета», «Чарли»Вебсайт с Redux, запрос сообщения, ответ на сообщение всегда в порядке?

Тогда ответное сообщение всегда в порядке?

Не существует ли ситуации, когда «Alpha» будет последним откликом, чтобы имя моего профиля было отредактировано в «Alpha» в конце?

Redux)

Например, я использую Redux в моем приложении.

В приложении Redux я отправлю EDIT_PROFILE_REQUEST действие с (socket.send) три раза, у которого есть полезная информация о профиле, «Альфа», «Бета», «Чарли» в порядке.

Затем, если процесс редактирования будет выполнен, будет отправлено действие EDIT_PROFILE_SUCCESS.

Часть, на которую я задаюсь, EDIT_PROFILE_SUCCESS также получена в порядке, «Альфа», «Бета», «Чарли». ?

Могу ли я гарантировать, что всегда ответное сообщение также должно быть в порядке, чтобы имя моего профиля редактировалось в «Charlie»?

ответ

1

Да, и нет.

TL; DR -> Вы не можете гарантировать, что сторонняя служба сокетов доставляет вам сообщения в этом порядке. Но, по большей части, вы можете настроить приложение javascript, чтобы вести себя так, как если бы это была гарантия.

Если вы используете socket.send, я предположим, что это сторонняя служба веб-сервисов, такая как socket.io. В этом случае вы обмениваетесь данными с вашего js-клиента, управляя внутренними данными «состояние» с сокращением, на другой компьютер, сервер веб-сервера.

Поведение websocket за пределами границы вашего javascript-клиента. Даже если служба считает, что она будет реагировать по порядку, реальный мир может вмешаться ... власть может выходить между запросами (A), (B) и (C). Затем A принимается и отвечает также, а также с (C), но сервер websocket никогда не видел (B).

Это экстремальный, но наглядный пример.

Redux может помочь сделать пару гарантий или безопасных допущений, если они выполнены соответствующим образом. Это может помочь гарантировать, что порядок, в котором изменяется состояние пользователя или данных вашего js-приложения, является синхронным, т. Е. Если вы делаете (a), тогда (b), то (c) только в приложении javascript они происходят в этом порядке во времени ,

Ключ тогда управляет этой границей. Вы управляете границей пользователя, нажимающего ваше приложение js, ожидая щелчка, после того, как пользователь решил нажать кнопку. Точно так же вы можете дождаться подтверждения из websocket, что он сделал (A) (B) или (C).

Наивный, но очень полезный шаблон для вашего примера будет заключаться в том, чтобы заставить ваше приложение js вести себя так, как будто заказ был гарантирован, с подходом «взять последний запрос». Если вы отключите socket.send (A), вы ждете ответа. Если (B) отправляется до того, как сокет говорит, что он получил (A), вы выбрасываете (A) и отправляете (B) и ждете, чтобы узнать, отвечает ли сокет, что операция (B) была успешной.

+0

Спасибо, как насчет использования концепции «порядковый номер», чтобы гарантировать заказ? Еще раз спасибо! Если есть какие-то ресурсы этой проблемы. дай мне знать, пожалуйста. ! Есть ли другое решение? – nujabes

+1

Простая, как кажется, эта проблема является одной из самых сложных и интересных задач в CS ... распределенных вычислениях. Это видео https://www.youtube.com/watch?v=9dALrnCOLNE прекрасно справляется с объяснением того, как некоторые, казалось бы, простые «проблемы порядка» становятся невероятно сложными и могут быть решены. На практике, хотя, используя redux на javascript-клиенте , есть гораздо более прямые и практичные способы «гарантирования порядка». У вас есть конкретная проблема, ошибка или случай использования? –

+1

Практический способ убедиться, что после трех изменений вы не вернетесь в «Альфа», чтобы не сгонять действие стиля «EDIT_SUCCESS», которое изменило бы имя в приложении JS на «Alpha», если это не было последний «EDIT_REQUEST», который был отправлен. То есть если вы отправили EDIT_REQUEST для бета-версии, после Alpha и получили успешное изменение BETA с веб-сайта, вы прекратите ждать успеха альфы и проигнорируете его. –

Смежные вопросы