Я отправляю данные из функции в Redis и в базу данных для уведомлений пользователям о статусе того действия, что они совершили. В базу данных я отправляю на хранение, а мой redis используется как проводник для отправки обновлений в сокеты. В принципе все работает почти так, как задумано.
Мне нужно сделать так:
действие 1 -> уведомление 1 -> действие 2 -> уведомление 2.
Но проблема в том, что когда я отправляю данные, я получаю следующее:
действие 1 -> ничего не происходит -> действие 2 -> уведомление действия #1 -> действие 3 -> уведомление действия #2.
То есть при первой отправке данных уведомление теряется. Как я могу это исправить?
Функция в Laravel:
$returnValue = [
'user_id' => $this->user->id,
'title' => 'Новое уведомление',
'message' => 'Уведомление '.Request::get('operation').'',
'status' => '1',
'html' => view('includes.notifications', compact('user_notifications'))->render(),
];
$this->redis->publish(self::NEW_NOTIFICATION, json_encode($returnValue));
Notify::create(
[
'id' => $last_id + 1,
'user_id' => $this->user->id,
'title' => 'Новое уведомление,
'message' => 'Уведомление '.Request::get('operation').'',
'status' => '1'
]
);
В бекенде nodejs я использую:
redisClient.subscribe('notify');
redisClient.subscribe('new.notify');
redisClient.on("message", function (channel, message) {
if (channel == 'new.notify')
{
io.sockets.emit(channel, message);
}
if (channel == 'del.notify')
{
io.sockets.emit(channel, message);
}
});
new.notify - это тот канал, куда поступают новые уведомления.
В blade у меня уведомления выводятся так:
@foreach($user_notifications as $notify)
@if ($notify->status == 2)
<div class="notification"><svg class="notification__type-icon" rv-svg-use="'notification-' | add model:type"><use xlink:href="#notification-error"></use></svg>
@elseif ($notify->status == 1)
<div class="notification"><svg class="notification__type-icon" rv-svg-use="'notification-' | add model:type"><use xlink:href="#notification-success"></use></svg>
@endif
<div class="notification__content">
<div class="notification__title">{{ $notify->title }}</div>
<div class="notification__text">{!! $notify->message !!}</div>
<div class="notification__date">{{ $notify->date }}</div>
</div>
@if ($notify->status == 2)
<svg width="100%" height="100%"><use xlink:href="#notification-remove"></use><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 25 25" id="notification-error">
<g fill="#E61414" fill-rule="nonzero">
<path d="M12.46 0C5.59 0 0 5.59 0 12.46c0 6.87 5.59 12.458 12.46 12.458 6.87 0 12.458-5.589 12.458-12.459C24.918 5.59 19.33 0 12.46 0zm0 22.876c-5.745 0-10.418-4.673-10.418-10.417S6.715 2.043 12.46 2.043s10.417 4.672 10.417 10.416c0 5.744-4.673 10.417-10.417 10.417z"></path>
<path d="M13.904 12.46l3.523-3.524a1.021 1.021 0 1 0-1.444-1.445l-3.524 3.524-3.523-3.524A1.021 1.021 0 0 0 7.49 8.935l3.524 3.524-3.524 3.524a1.021 1.021 0 0 0 1.444 1.444l3.524-3.524 3.524 3.524a1.019 1.019 0 0 0 1.444 0 1.021 1.021 0 0 0 0-1.444l-3.523-3.524z"></path>
</g>
</svg></svg>
@elseif ($notify->status == 1)
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 25 25" id="notification-success">
<g fill="#82E614" fill-rule="nonzero">
<path d="M12.46 0C5.59 0 0 5.59 0 12.46c0 6.87 5.59 12.458 12.46 12.458 6.87 0 12.458-5.589 12.458-12.459C24.918 5.59 19.33 0 12.46 0zm0 22.876c-5.745 0-10.418-4.673-10.418-10.417S6.715 2.043 12.46 2.043s10.417 4.672 10.417 10.416c0 5.744-4.673 10.417-10.417 10.417z"></path>
<path d="M17.85 7.677l-7.398 7.398-3.383-3.382a1.021 1.021 0 0 0-1.444 1.444l4.104 4.104a1.018 1.018 0 0 0 1.445 0l8.12-8.12a1.021 1.021 0 0 0-1.445-1.444z"></path>
</g>
</svg>
@endif
</div>
@endforeach
В JS сайта я использую:
.on('new.notify', function (data) {
data = JSON.parse(data);
$('#notifications').html(data.html);
console.log(data);
})
Console.log(data) при первом действии в секции html выводит мне пустое значение:
уже при следующем действии мне начинает рендерить шаблон и console.log показывает предыдущее значение в секции html.
И есть сам POST запрос в JS, который обрабатывает действие на кнопке:
$('.calc').click(function () {
var operation = $(this).attr('data-type');
$.post('/api/new', {operation: operation}, function (data) {
});
});
В чём может быть проблема? Неправильный вывод в JS, либо что? Как это можно исправить?