ugrás a tartalomhoz

prototype AJAX request timeout

s_volenszki · 2007. Szep. 26. (Sze), 11.50
Sziasztok!

Egyre jobban tetszik ez a prototype! Ismer valaki doksit AJAX request timeout kezelésre prototype-ban?

Találtam egyet http://codejanitor.com/wp/ajax-timeouts-with-prototype/, de az nem működik megfelelően! Ha bekövetkezik az időtúllépés, csak akkor adja a hibaüzenetet, ha az amúgy megkezdett request sikeresen lezajlik.

Ezidáig AjaxToolbox-ot használtam, és abban a timeout esetén törölte a folyamatban lévő kérést. Ugyan azt szeretném elérni!

Köszike, s_volenszki
 
1

Most már egészen kerek, de még mindíg alert-el!

s_volenszki · 2007. Okt. 3. (Sze), 11.07
Sziasztok!

Na már odáig eljutottam, hogy működik az időzítés, és a request törlődik is, de még mindig van egy üres alert és nem tudom miért! Nézzétek meg! Köszönöm!

A js kód:
  1. var AjaxOn = false;  
  2. function DoSomeAjax(){  
  3.     AjaxRequest = new Ajax.Request('ajax/teszt.php',  
  4.         {  
  5.             method:'post',  
  6.             parameters: {id:12},  
  7.             onSuccess: function(transport){AjaxOn = false;alert(transport.responseText);},  
  8.             onFailure: function(){ alert('Something went wrong...');}  
  9.         }  
  10.     );  
  11.     AjaxOn = true;  
  12.     new PeriodicalExecuter(function(CheckAjax)  
  13.         {  
  14.             CheckAjax.stop();  
  15.             if(AjaxOn)  
  16.             {  
  17.                 alert('Időtúllépés!');  
  18.                 AjaxRequest.transport.abort();   
  19.             }  
  20.         }, 3);  
  21. }  
a php kód:
  1. <?php  
  2. header('Content-Type: text/html; charset=ISO-8859-2');  
  3.   
  4. if(emptyempty($_POST))  
  5. {  
  6.         print "No direct access for this page!";  
  7. }  
  8. else  
  9. {  
  10.         sleep(5);  
  11.         echo "Gone";  
  12. }  
  13. ?>  
A php-ben altatom 5 másodpercet, js meg időzítek 3-ra. Minden baró, de olyan, mintha az ajaxRequest.transport.abort(); után lenne egy alert('');

De nincs!

s_volenszki

/off: érdekes, hogy a colorer az empty php fügvényt nem kicseréli színesre, hanem beírja mégegyszer!/
2

példák

zila · 2007. Okt. 3. (Sze), 11.24
Ezeket nézted már?
http://codejanitor.com/wp/2006/03/23/ajax-timeouts-with-prototype/
és
http://www.brainsick.com/prototype/requestTimeout.patch/ajax.html.txt
3

Nem csak néztem, ki is próbáltam.

s_volenszki · 2007. Okt. 3. (Sze), 16.42
Az elsőből indultam ki, és onnan ered a probléma, hogy az AjaxRequest.transport.abort(); visszatér egy üres alert-el! Te már kipróbáltad? Lehet, hogy másban van a gixer?

Most kipróbáltam Operával, és ott jó! Mi lehet az oka?

IE 6.0 és Ffx 2.0 az AjaxRequest.transport.abort(); után közvetlenül ad egy alert('')-et, Opera meg nem!
Netscape ha Display like IE akkor ugyan az, műxik csak jön az alert, ha Disply like FF akkor nem működik és ez van a javascript hibakonzolon: ancestor has no property????

s_volenszki
4

Az általam használt verzió

zila · 2007. Okt. 3. (Sze), 17.21
Nekem ez van (régi, át kéne térni az onTimeot használatára, de nincs kedvem, hozzányúlni :)
  1. function ajaxInProgress (xmlhttp) {  
  2.     switch (xmlhttp.readyState) {  
  3.         case 1: case 2: case 3:  
  4.             return true;  
  5.         // Case 4 and 0  
  6.         default:  
  7.             return false;  
  8.     }  
  9. }  
  10. var ajaxGlobalHandlers = {  
  11.     onCreate: function(request){  
  12.                 request['timeoutId'] = window.setTimeout(  
  13.                         function() {  
  14.                             if (ajaxInProgress(request.transport)) {  
  15.                                 request.transport.abort();  
  16.                                 showFailureMessage();  
  17.                                 if (request.options['onFailure']) {  
  18.                                     request.options['onFailure'](request.transport, request.json);  
  19.                                 }  
  20.                             }  
  21.                         },  
  22.                         60000 // 60 mp  
  23.                 );  
  24.                 Element.show('systemWorking');  
  25.               },  
  26.     onComplete: function(request) {  
  27.                   if (Ajax.activeRequestCount == 0){  
  28.                     Element.hide('systemWorking');  
  29.                   }  
  30.                   debug("AJAX open requests: "+Ajax.activeRequestCount);  
  31.                   window.clearTimeout(request['timeoutId']);  
  32.                 }  
  33. };  
  34.   
  35. try {  
  36.     Ajax.Responders.register(ajaxGlobalHandlers);  
  37. catch(e) {  
  38.     error("Critical error");  
  39. }  
A lényeg, hogy minden ajax kérés indításakor (onCreate) indítok egy timert, ami megkapja paraméterként a request objektumot, amelyik érintett a timeoutban így nincs scope probléma...
5

Köszi, sikerült megtalálnom a hibát!

s_volenszki · 2007. Okt. 4. (Cs), 09.24
Nem is tudom, merjem-e egyáltalán elmondani, mi volt a hiba, amiért mindíg volt egy üres alertem! Hátha más okul belőle! :)

Én (naívan) azt gondoltam, az onSucces kitétel azt jelenti, hogy sikeresen lezajlott a AjaxRequest! És ha AjaxRequest.transport.abort()-van, akkor az értelem szerűen onFailure, mert hát nem lett sikeres!

Na! Akkor ezt most biztosan állíthatom, hogy nem így van! Ha időtúllépés miatt megszakítom az AjaxRequest-et, akkor is az onSucces eseményen tér vissza, és mivel AjaxRequest.transport üres volt, ezért, az onSucces-re definiálta alert üres alert lett! :[

Ezek után, ez már tuti jól működik (IE6 Ffx 2.0):
  1. var AjaxOn = false;  
  2. function DoSomeAjax(){  
  3.     AjaxRequest = new Ajax.Request('ajax/teszt.php',  
  4.         {  
  5.             method:'post',  
  6.             parameters: {id:12},  
  7.             onSuccess: function(transport){AjaxOn = false;AjaxGone(transport.responseText);},  
  8.             onFailure: function(){ alert('Something went wrong...');}  
  9.         }  
  10.     );  
  11.     AjaxOn = true;  
  12.     new PeriodicalExecuter(function(CheckAjax)  
  13.         {  
  14.             CheckAjax.stop();  
  15.             if(AjaxOn)  
  16.             {  
  17.                 AjaxRequest.transport.abort();   
  18.             }  
  19.         }, 5);  
  20. }  
  21. function AjaxGone(result){  
  22.     if(result.length > 0)  
  23.     {  
  24.         alert(result);  
  25.     }  
  26.     else  
  27.     {  
  28.         alert('Nincs válasz');  
  29.     }  
  30. }  
s_volenszki