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:

    var AjaxOn = false;
    function DoSomeAjax(){
        AjaxRequest = new Ajax.Request('ajax/teszt.php',
            {
                method:'post',
                parameters: {id:12},
                onSuccess: function(transport){AjaxOn = false;alert(transport.responseText);},
                onFailure: function(){ alert('Something went wrong...');}
            }
        );
        AjaxOn = true;
        new PeriodicalExecuter(function(CheckAjax)
            {
                CheckAjax.stop();
                if(AjaxOn)
                {
                    alert('Időtúllépés!');
                    AjaxRequest.transport.abort(); 
                }
            }, 3);
    }
a php kód:

<?php
header('Content-Type: text/html; charset=ISO-8859-2');

if(empty($_POST))
{
        print "No direct access for this page!";
}
else
{
        sleep(5);
        echo "Gone";
}
?>
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 :)

function ajaxInProgress (xmlhttp) {
	switch (xmlhttp.readyState) {
		case 1: case 2: case 3:
			return true;
		// Case 4 and 0
		default:
			return false;
	}
}
var ajaxGlobalHandlers = {
	onCreate: function(request){
				request['timeoutId'] = window.setTimeout(
						function() {
							if (ajaxInProgress(request.transport)) {
								request.transport.abort();
								showFailureMessage();
								if (request.options['onFailure']) {
									request.options['onFailure'](request.transport, request.json);
								}
							}
						},
						60000 // 60 mp
				);
				Element.show('systemWorking');
			  },
	onComplete: function(request) {
				  if (Ajax.activeRequestCount == 0){
					Element.hide('systemWorking');
				  }
		    	  debug("AJAX open requests: "+Ajax.activeRequestCount);
		    	  window.clearTimeout(request['timeoutId']);
				}
};

try {
	Ajax.Responders.register(ajaxGlobalHandlers);
} catch(e) {
	error("Critical error");
}
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):

    var AjaxOn = false;
    function DoSomeAjax(){
        AjaxRequest = new Ajax.Request('ajax/teszt.php',
            {
                method:'post',
                parameters: {id:12},
                onSuccess: function(transport){AjaxOn = false;AjaxGone(transport.responseText);},
                onFailure: function(){ alert('Something went wrong...');}
            }
        );
        AjaxOn = true;
        new PeriodicalExecuter(function(CheckAjax)
            {
                CheckAjax.stop();
                if(AjaxOn)
                {
                    AjaxRequest.transport.abort(); 
                }
            }, 5);
    }
    function AjaxGone(result){
        if(result.length > 0)
        {
            alert(result);
        }
        else
        {
            alert('Nincs válasz');
        }
    }
s_volenszki