Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Asynchroniczne wywołanie websocketu do serwera php
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
rafaliex
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ź.
trueblue
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.
rafaliex
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.
nospor
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
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.