Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Asynchroniczne wywołanie websocketu do serwera php
rafaliex
post 23.07.2024, 18:17:02
Post #1





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 21.08.2010

Ostrzeżenie: (0%)
-----


Witam,
Mam taki temat mam dashboard na którym jest kilkanaście elementów i tam przyciski z różnymi klasami, i w zależności w jakim statusie jest dany element to ma on inną klasę np element ma klasę .error albo .alert

I teraz załóżmy ze mam 10 obiektów z klasą .error

Wywołuję selektorem kliknięcie na element .error więc powinno się tych 10 elementów kliknąc w ułamku sekundy wszystkie na raz i teoretycznie tak się dzieje ponieważ w konsoli otrzymuje 10 wpisów "WebSocket communication initiated." lecz nie tworzy 10 niezależnych websocketów.



To jest kod który zrobiłem, chciałem aby po kliknięciu wywołac odpytanie poprzez javascript by asynchronicznie odwołał się poprzez websocket do serwera php i po zakończeniu wrzuciło zwrotki z serwera php.
Lecz problem w tym że niby uruchomiło się 10 odwołań ale na serwerze php widzę jak przeglądarka się łączy poprzez websocket jeden po drugim, nie robi się 10 socketów na raz tylko robi się 1 socket wykonywana jest operacja w php (pętla trwająca 5 sekund) i zwraca do klienta odpowiedź i robi się 2 socket itd.



  1. function sendMessage(ws, message) {
  2. return new Promise((resolve, reject) => {
  3. ws.onmessage = (event) => {
  4. console.log('Message received:', event.data);
  5. resolve(event.data);
  6. };
  7.  
  8. ws.onerror = (error) => {
  9. console.error('WebSocket error:', error);
  10. reject(error);
  11. };
  12.  
  13. ws.send(message);
  14. });
  15. }
  16.  
  17. async function handleWebSocketCommunication(url, message) {
  18. try {
  19. const ws = await createWebSocket(url);
  20. const response = await sendMessage(ws, message);
  21. console.log('Response from server:', response);
  22. ws.close(); // Zamknięcie połączenia WebSocket po odebraniu odpowiedzi
  23. } catch (error) {
  24. console.error('Error:', error);
  25. }
  26. }
  27.  
  28. $('body').on('click', '.execute_import', async () => {
  29. // Wywołanie handleWebSocketCommunication w osobnym kontekście asynchronicznym
  30. var host = "wss://localhost:8089";
  31. handleWebSocketCommunication(host, 'Wiadomosc do serwera');
  32. console.log('WebSocket communication initiated.');
  33. });







I w konsoli serwera php widze że sockety sa tworzone jeden po drugim o odstępie okolo 5 sekund czyli po sleepie. A oczekiwanym efektem jest by wszystkie sockety zrobiły się na raz i zwrociły wyniki po tym jak serwer będzie przez websocket wysyłał odpowiedź.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 3)
trueblue
post 24.07.2024, 06:16:03
Post #2





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Ale ty za każdym wywołaniem tworzysz nowy obiekt WebSocket? Przecież wystarczy jeden, a potem nasłuchujesz zdarzenie onMessage.

Dlaczego w ogóle używasz do tego WebSockets? Jeśli potrzebujesz komunikacji JS<->PHP, to wystarczy Ajax/FetchAPI.


--------------------
Go to the top of the page
+Quote Post
rafaliex
post 24.07.2024, 13:46:46
Post #3





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 21.08.2010

Ostrzeżenie: (0%)
-----


Gdy używam ajaxa to zachowuje się to identycznie, gdy wywołam funkcję która odpytuje url i wysyła POST'em dane to i tak działa to jedno po drugim, czyli wysyła request do serwera pierwszy element i czeka na otrzymanie danych i dopiero leci drugi itd.

Stąd stwierdziłem ze wykorzystam websocket żeby były to osobne sesje.
Go to the top of the page
+Quote Post
nospor
post 24.07.2024, 14:14:02
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




skoro uzywasz "synchronicznego" wywolania przy uzyciu await to sie nie dziw ze leci jeden po drugim wink.gif Bo zakladam ze przy ajax tez robiles await. Ajax z natury jest asynchroniczy i tam sie zadnych promise i awaitow nie uzywa. wtedy to fajnie lata rownolegle

swoja droga droga widze to inny blad logiczny bo zamiast wysylac 10 requestow to powinienes zebrac dane i wyslac tylko jeden


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 14:57