Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Zatrzymanie wykonywania skryptu po osiągnięciu celu, return nie działa
rozny
post 17.07.2012, 12:37:45
Post #1





Grupa: Zarejestrowani
Postów: 116
Pomógł: 0
Dołączył: 14.01.2004
Skąd: Zielona Góra

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


Witam, nie wiem czy to do końca dobry dział, bo w grę wchodzi też AJAX. Jeśli zły to proszę o przeniesienie.

Problem jest taki:

Mam skrypt, który ajaxem wysyła dane do skryptu php i odbiera wyniki. Po otrzymaniu pierwszej porcji wyników wstrzymuje działanie na określony czas i po tym czasie wywołuje się po raz kolejny. Chcę żeby działo się tak tak długo jak skrypt php będzie miał co robić (wysyłka newslettera). Jeżeli skrypt php wyśle wszystkie mejle chcę żeby działanie skryptu wywołującego się zakończyło. I tutaj mam problem, bo po otrzymaniu komunikatu o wysłaniu wszystkich mejli skrypt odczekuje swój interwał czasowy i działa dalej.

Oto kod:

  1. function wyslijSzablon() {
  2.  
  3. xmlhttp = typeof XMLHttpRequest == "undefined" ? new ActiveXObject('Microsoft.XMLHttp'):new XMLHttpRequest();
  4.  
  5. document.getElementById("loading").style.display="block";
  6. var distList = document.getElementById("dist_list").value;
  7. var selectTemplate = document.getElementById("html_template").value;
  8. var postSubject = document.getElementById("subject").value;
  9. var postNewsletter = document.getElementById("newsletter").value;
  10. var url = "template_engine.php";
  11. var params = "dist_list=" + encodeURIComponent(distList) + "&";
  12. params += "html_template=" + encodeURIComponent(selectTemplate) + "&";
  13. params += "newsletter=" + encodeURIComponent(postNewsletter) + "&";
  14. params += "subject=" + encodeURIComponent(postSubject);
  15.  
  16. xmlhttp.open("POST",url,true);
  17. xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
  18. xmlhttp.send(params);
  19. xmlhttp.onreadystatechange = stateChanged;
  20.  
  21. }
  22.  
  23. function stateChanged() {
  24.  
  25. if (xmlhttp.readyState == 4) {
  26.  
  27. document.getElementById("head").style.display="block";
  28. document.getElementById("head").innerHTML=xmlhttp.responseText;
  29. if (xmlhttp.responseText != 'Newsletter został wysłany do wszystkich subskrybentów.') {
  30. setInterval("wyslijSzablon()", 10000);
  31. }
  32. else {
  33. document.getElementById("loading").style.display="none";
  34. }
  35. }
  36. }
  37.  
  38. function GetXmlHttpObject() {
  39.  
  40. if (window.XMLHttpRequest) {
  41.  
  42. return new XMLHttpRequest();
  43. }
  44.  
  45. return null;
  46.  
  47.  
  48. }


Generalnie skrypt nie powinien się wywołać poraz kolejny kiedy otrzyma potwierdzenie o wysyłce mejli pod wszystkie adresy, niemniej i tak się wywołuje.
Zrobiłem:

  1. if (xmlhttp.responseText != 'Newsletter został wysłany do wszystkich subskrybentów.') {
  2. setInterval("wyslijSzablon()", 10000);
  3. }
  4. else {
  5. document.getElementById("loading").style.display="none";
  6. return false;
  7. }


Ale wtedy skrypt nie wykonuje się w ogóle. Próbowałem również z return false na końcu funkcji wyslijSzablon, ale wtedy skrypt również się nie wykonywał w ogóle. Może ktoś nakierować jak to rozwiązać?
Go to the top of the page
+Quote Post
redeemer
post 17.07.2012, 12:50:01
Post #2





Grupa: Zarejestrowani
Postów: 915
Pomógł: 210
Dołączył: 8.09.2009
Skąd: Tomaszów Lubelski/Wrocław

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


Pomyliłeś chyba setInterval z setTimeout.


--------------------
Go to the top of the page
+Quote Post
rozny
post 17.07.2012, 13:01:02
Post #3





Grupa: Zarejestrowani
Postów: 116
Pomógł: 0
Dołączył: 14.01.2004
Skąd: Zielona Góra

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


Nie pomyliłem. Setinterval ustawia czas, po którym skrypt wykona wysyłkę pod kolejną porcję mejli. SetTimeOut w tym miejscu

  1. if (xmlhttp.responseText != 'Newsletter został wysłany do wszystkich subskrybentów.') {
  2. setInterval("wyslijSzablon()", 10000);
  3. }


zakończyłby mi wykonywanie skryptu po pierwszej porcji mejli, a tego nie chcę....
Go to the top of the page
+Quote Post
redeemer
post 17.07.2012, 13:11:10
Post #4





Grupa: Zarejestrowani
Postów: 915
Pomógł: 210
Dołączył: 8.09.2009
Skąd: Tomaszów Lubelski/Wrocław

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


setInterval wykonuje funkcję co jakiś interwał czasowy, dopóki nie zrobisz clearInterval. setTimeout wykonuje funkcje tylko raz po pewnym czasie.

W Twoim przypadku funkcja stateChanged będzie robić setTimeout za każdym razem, chyba, że xmlhttp.responseText == 'Newsletter został wysłany do wszystkich subskrybentów.'

Ten post edytował redeemer 17.07.2012, 13:15:13


--------------------
Go to the top of the page
+Quote Post
rozny
post 17.07.2012, 13:29:08
Post #5





Grupa: Zarejestrowani
Postów: 116
Pomógł: 0
Dołączył: 14.01.2004
Skąd: Zielona Góra

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


Masz rację, już działa jak trzeba. dzięki smile.gif
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: 20.07.2025 - 15:19