[TYPO3-UG Dutch] Ajax-probleem

WP Perquin perquin at yuplounge.nl
Thu Nov 13 21:40:11 CET 2008


Beste H. Hahn

Als ik het goed lees weet je niet wat de omvang van het resultaat is. Daarmee weet je niet hoeveel er al gedaan is en hoeveel er nog moet gebeuren. Het enige dat je weet is dat het proces is opgestart. Thans dat begrijp ik uit je tekst. Dan is onderstaand scriptje helemaal iets voor jouw.

Een niet getest voorbeeld:
function voereenfunctieuit()
{
	
	var url = '/fileadmin/hier-staat-het-script.php';
	var collect_get_var = waarden-die-je-verstuurd;
	var myAjax = new Ajax.Updater(
		'de-div-waar-alles-komt-te-staan', 
		url, 
		{
			method: 'post', 
			parameters: collect_get_var,
			onCreate: function(){
				Element.show('show-de-div-met-voortgangs-balkje');
			},
			onException: function(){
				Element.hide('show-de-div-met-voortgangs-balkje');
				Element.show('foutmelding');
			},
			onComplete: function(){
				Element.hide('show-de-div-met-voortgangs-balkje');
			}
		});
}

Deze functie zorgt ervoor dat je procesindicator blijft lopen, tot dat er een resultaat is (onComplete), of er iets mis gaat (OnExeption).

Werken met periodicalUpdater doe je bijvoorbeeld om periodiek nieuws op te halen of ervoor te zorgen dat een gebruiker, wanneer hij niets doet, toch ingelogd kan blijven.

Bij bijvoorbeeld het uploaden van een bestand werk je ook met periodicalupdater. Je weet immers aan het begin al hoe groot het bestand is. Dat vergelijk je steeds met de huidige grootte van het geuploade bestand. Het verschil is het percentage dat nog binnengehaald dient te worden.

Overigens periodicalupdater kent wel een groot gevaar. Het belast je server behoorlijk. Immers je stuurt iedere x seconde een request naar je server toe. Dus naast het proces dat er al loopt heb je ook nog de requests erbij. Per gebruiker heb je dan meerdere requests. Dan loopt het gauw richting het maximum aantal van apache (verschillend per server, meestal 200).

Succes

Willem

-----Oorspronkelijk bericht-----
Van: typo3-ug-dutch-bounces at lists.netfielders.de [mailto:typo3-ug-dutch-bounces at lists.netfielders.de] Namens H. Hahn
Verzonden: donderdag 13 november 2008 21:06
Aan: typo3-ug-dutch at lists.netfielders.de
Onderwerp: Re: [TYPO3-UG Dutch] Ajax-probleem

Bedankt voor de reactie. Helaas begrijp ik niet helemaal wat u bedoelt. 
Die "processtappen" 1 t/m 4 zijn volgens mij veel te "grof" voor een 
proces dat in totaal wel een minuut of tien in beslag kan nemen. Ik 
vrees dan ook dat onCreate, onComplete etc. hier ook niet veel aan 
toevoegen; zij betreffen in feite de statusovergangen van de genoemde 
stappen.

Intussen bedacht ik nog het volgende. Ik zou twee Ajax-objecten kunnen 
maken. Eerst Ajax.Request, om het serverscript te starten. Dat script 
schrijft zijn voortgangsrapportage in een bestandje (te verwachten 
grootte uiteindelijk ruwweg een regel of twintig van elk zo'n 50 à 80 
tekens, dus pakweg een 1,6 kB).
Meteen na het starten van Ajax.Request zou ik dan een 
AjaxPeriodicalUpdater starten die een ander script start dat het 
bestandje uitleest, de inhoud in een onzichtbare <div> zet, en 
vervolgens een javascriptfunctie oproept die de gegevens uit die <div> 
verwerkt tot de gewenste voortgangsindicatie. Als het lezen van het 
bestandje niet lukt doordat het eerste serverscript er net in aan het 
schrijven is, kan ik de update van de voortgangsindicatie wel voor een 
keer overslaan. Het is immers toch geen nauwkeurige meting. Desnoods 
laat ik de PU om de 2 seconden draaien i.p.v. om de seconde.

Is dit een reële mogelijkheid of zie ik iets over het hoofd? Of is er 
nog een andere mogelijkheid om het door Request gestarte script gegevens 
te laten doorgeven aan het door PeriodicalUpdater gestarte script?
H. Hahn


WP Perquin schreef:
> Dat gaat je niet zo lukken wat je wilt. Je kunt namelijk niet achterhalen
> welk apache proces het betreft.
>
> De enige manier is de stappen die een proces doorlopen (4 in totaal) in de
> gaten houden.
>
> Ik doe het zelf met responders:
> http://www.prototypejs.org/api/ajax/responders
>
> Zolang het niet oncomplete is kan je je voortgangsindicator laten zien.
> Bij oncomplete hide je die weer.
>
> Belangrijk hierbij is oa de onCreate, onException en onComplete.
>
> Immers een verbinding kan wegvallen (dan wil je wel dat er iets gebeurt).
>
> Succes
>
> Willem
>
> -----Oorspronkelijk bericht-----
> Van: typo3-ug-dutch-bounces at lists.netfielders.de
> [mailto:typo3-ug-dutch-bounces at lists.netfielders.de] Namens H. Hahn
> Verzonden: donderdag 13 november 2008 15:50
> Aan: typo3-ug-dutch at lists.netfielders.de
> Onderwerp: [TYPO3-UG Dutch] Ajax-probleem
>
> Eigenlijk is dit geen Typo3-vraag, maar misschien kan iemand me toch op 
> weg helpen? Ik heb inmiddels mijn eerste schreden gezet op het gebied 
> van Ajax (met Prototype.js). Leuk spul. Alleen wat ik wil hebben, lukt 
> me nog niet.
>
> *Situatie:* Op de server draait een script. Het maakt niet uit wat, maar 
> het heeft nogal wat tijd nodig (vari�rend van bij 2 tot 10 minuten). Het 
> kan bijvoorbeeld gegevensverwerking zijn, of ingewikkelde berekeningen, 
> of wat dan ook. Alleen het duurt een tijdje. Daarom wil ik in de browser 
> een voortgangsindicatie weergeven.
>
> Met Ajax.Request en/of Ajax.Updater zonder meer gaat dat niet, want die 
> zouden het proces steeds opnieuw starten.
> Ajax.PeridiodicaUpdater ligt meer voor de hand, omdat die juist bedoeld 
> is om te pollen. Ik zou het proces kunnen starten met bijv. 
> Ajax.Request. Vervolgens zou ik Ajax.PeriodicalUpdater kunnen gebruiken 
> om bijv. elke seconde de status op te vragen. Maar voor zover ik het 
> begrijp. kan Ajax.Updater alleen informatie van de server zelf opvragen 
> (bijv. datum en tijd). Ik wil hem echter de status laten opvragen van 
> een eerder (met Ajax.Request of Ajax.Updater) gestart proces. Als 
> Ajax.Request het event "Complete" rapporteert, kan ik de 
> PeriodicalUpdator stoppen.
>
> *Probleem:* Hoe vertel ik Ajax.PeriodicalUpdater dat hij gegevens van 
> dat eerder gestarte en nog steeds draaiende proces moet opvragen, en 
> niet van de server zelf?
>
> Bij wijze van test zou ik Ajax.Request bijvoorbeeld een script kunnen 
> laten starten met:
>
> <?php
> for ($i = 0; $i < 100; $i++)
> {
>   $rv = rand (1, 10);               // randomgetal tussen 1 en 10
>   sleep ($rv);                      // wacht een willekeurige tijd tussen 1
> en 10 seconden
>   ...                               // ??
> }
> ?>
>
> Ajax.PeriodicalUpdater zou dan elke seconde moeten pollen wat de waarde 
> van $i op dat moment is.
> Als dat lukt, zou er een met onregelmatige snelheid een lijst van de 
> getallen 1...99 moeten worden weergegeven.
>
> Ik zou natuurlijk in bovenstaande lus de waarde van $i in een bestandje 
> kunnen opslaan en Ajax.PeriodicalUpdater dat laten uitlezen. Maar dat 
> lijkt me wat omslachtig, te meer daar het in werkelijkheid niet om ��n 
> getal ($i) gaat, maar om veel meer gegevens (om een idee te geven: een 
> in de loop van het proces oplopend aantal regels tekst, waarbij soms 
> meerdere regels binnen een seconde worden toegevoegd, en het een andere 
> keer enkele seconden duurt voor er weer een regel bij komt). Ook zal 
> voor het uitlezen van het bestandje een PHP-scriptje moeten worden 
> gestart, waardoor het waarschijnlijk niet zal lukken met 
> Ajax.PeriodicalUpdater en ik Ajax.Updater in een lus met een frequentie 
> van 1/s kunnen laten draaien.
> Ook bestaat het risico dat het pollen soms niet lukt omdat het andere 
> script net in het bestand aan het schrijven is (hoewel dit valt te 
> omzeilen).
>
> Graag advies. Bij voorbaat dank.
> Mvg.,
> H. Hahn
> _______________________________________________
> TYPO3-UG-dutch mailing list
> TYPO3-UG-dutch at lists.netfielders.de
> http://lists.netfielders.de/cgi-bin/mailman/listinfo/typo3-ug-dutch
>
>
>   
_______________________________________________
TYPO3-UG-dutch mailing list
TYPO3-UG-dutch at lists.netfielders.de
http://lists.netfielders.de/cgi-bin/mailman/listinfo/typo3-ug-dutch




More information about the TYPO3-UG-dutch mailing list