Frage Titel kann etwas verwirrend sein, versuchte ich mein Bestes, es zu erklären.Laravel Echo wiederholen hören Ereignis für n-mal Sendung wurde gemacht
Ich habe laravel-echo-server
, redis
(für Warteschlangen) und Laravel echo
eingerichtet. Ich möchte nur eine Nachricht über eine Eingabe senden und den Nachrichten-Feed für alle auf der Seite aktualisieren. im Wesentlichen ein Chatraum.
Alles funktioniert, abgesehen von der Tatsache, dass es langsam wie die Hölle ist, aber ich bin neu in Laravel Echo
und Vue
.
Wenn ich eine Nachricht gesendet habe, ist es in Ordnung, aber wenn ich eine weitere Nachricht sende, erhalte ich zwei Antworten. Senden Sie eine dritte Nachricht drei Antworten und so weiter ...
Was genau mache ich falsch? Ich habe überprüft socket.io
/laravel-echo-server
ist nur Verbindung mit dem Kanal einmal, und meine broadcast
wird nur einmal gesendet (Überprüfung der Warteschlange Worker es verarbeitet nur die Anfrage), also wie wird es wiederholt exponentiell?
Das ist mein app.js:
const chatWindow = new Vue({
el: '#chatWindow',
data: {
messages: []
},
methods: {
sendMessage: function() {
this.$http.post('/chat', {message: this.message}).then((response) => {
window.Echo.channel('test-chat-channel')
.listen('MessageSent', (event) => {
console.log(event.message);
// this.messages.push(event.message);
});
}, (response) => {
// error callback
});
this.message = '';
}
},
props: ['message']
});
Dies ist mein Chat Ansicht:
<div id="chatWindow" class="col-sm-7">
<h1 class="text-center no-top">Chat</h1>
<div class="chat-window">
<ul>
<li v-for="message in messages">@{{ message }}</li>
</ul>
<div class="form-group">
<input title="Send Message" v-model="message" @keyup.enter="sendMessage" class="form-control" placeholder="Send message...">
</div>
</div>
</div>
Gerade falls sie hier relevant sind, ist meine Route:
Route::post('/chat', function (Request $request) {
event(new MessageSent($request->message));
});
und mein Ereignis:
<?php
namespace App\Events;
use Illuminate\Broadcasting\Channel;
use Illuminate\Queue\SerializesModels;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
class MessageSent implements ShouldBroadcast
{
use InteractsWithSockets, SerializesModels;
public $message;
public function __construct($message)
{
$this->message = $message;
}
public function broadcastOn()
{
return new Channel('test-chat-channel');
}
}
Ich denke, dass Sie hier auf etwas sein können. Was ich denke, ich sollte trennen die Listen-Methode, und nicht im Antwort-Callback für erfolgreiche Anfrage haben ... Dies ist wahrscheinlich, was das Problem verursacht - ich brauche eigentlich keine Antwort Rückruf, nur ein Fehler Rückruf und auf das Ereignis außerhalb der Anfrage zu hören, um ein Überabonnement zu vermeiden. Danke dafür, ich werde es versuchen und Sie wissen lassen! –
@ A.Appleby Das sieht mir auch wahrscheinlich. –
@ A.Appleby Wie geht es? Hast du es gelöst? Kann ich helfen? –