Är ingen hejare på Javascript och skulle behöva hjälp med en Ajax-applikation som jag kört fast med. Har mest programmerat ASP genom åren så jag skulle behöva lite hjälp här. Tanken är att default.asp visar upp en siffra för användarna. I den kod jag snickrat ihop så plockar scriptet detta värde från sidan time.asp som innehåller följande kod. Hm, det du efterfrågar är inte riktigt möjligt på något _bra_ sätt i HTTP, beroende på vad man nu säger är bra dvs.. Problemet är att du endast kan få till en anslutning från klient till server, där klienten frågar någonting och servern svarar. Om servern vill skicka någonting till klienten så måste klienten först ha frågat efter det. Ok, tack för svar! Du skulle få skapa en sida på servern som pausar sig själv tills ett event har körs (typ manualresetevent eller liknande), eller en timeout har gått. (Någon wait-grej, tråden ska inte köras är hela poängen.) Sedan måste du någonstans ha kod som triggar eventet, typ kod som har koll på databasen. Den skulle troligtvis inte ligga på samma sida, utan i typ någon httpmodule eller liknande. Största problemet i scriptet måste vara den här raden: Tack för era svar!Problem med AJAX lösning...
response.expires=-1
response.write(värde)
Tanken är att variabeln värde ska hämtas av sidan från en databas, och att sidan default.asp ska hämta upp värdet i realtid direkt värdet ändras i databasen. Har testat det så att jag helt enkelt har skrivit in ett nytt värde innaför parentesen ovan (värde) och helt enkelt sparat ner för att simulera en värdeändring från databas. DÅ har det fungerat tack vare att jag lagt en ständig koll mot sidan via SetTimeout i default.asp.
Problemet som uppstår är att den ständiga kollen mot time.asp käkar upp allt minne på kilentsidan, så det här är inte rätt metod, även om funktionen i sig är rätt när man som snvändare är inne på sidan. Nu hämtar ju default.asp upp data från time.asp hela tiden och däri ligger problemet med att minnet tar slut. Den rätta lösningen vore ju att det skickades data direkt till default.asp istället när en ändring av värdet sker. Någon sorts trigger eller nåt som ändrar värdet i realtid på klientsidan utan uppdatering av sidan. Kan någon kunnig visa hur jag kan göra detta med ASP, Javascript och Ajax?
Koden i default.asp ser ut som nedan. Tack på förhand!
<html>
<body>
<script type="text/javascript">
function ajaxFunction()
{
var xmlHttp;
try
{
// Firefox, Opera 8.0+, Safari
xmlHttp=new XMLHttpRequest();
}
catch (e)
{
// Internet Explorer
try
{
xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e)
{
try
{
xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e)
{
alert("Your browser does not support AJAX!");
return false;
}
}
}
xmlHttp.onreadystatechange=function()
{
if(xmlHttp.readyState==4)
{
document.myForm.time.value=xmlHttp.responseText;
}
}
xmlHttp.open("GET","time.asp",true);
xmlHttp.send(null);
}
</script>
<script>
function test() {
ajaxFunction();
setTimeout("test()", 0000);
}
</script>
<script>
test();
</script>
<form name="myForm">
Time: <input type="text" name="time" />
</form>
</body>
</html>
Sv: Problem med AJAX lösning...
Nu till det intressanta: Om klienten skapar en anslutning med _lång_ timeout till servern, och servern struntar i att svara på ett tag, ända tills att antingen timeouten är på väg att gå ut, eller tills att det man väntar på har hänt (t.ex. att ditt värde har uppdaterats) så kan man "emulera" att servern skickar till klienten.
Problemet: Klassiska webbservrar har problem med det där, de klarar inte av att hantera så många anslutningar samtidigt (även om majoriteten av anslutningarna bara ligger och väntar och faktiskt inte gör någonting.) Men t.ex. webbservern jetty (för java vill jag minnas) och IIS 7.0 (med asp.net) klarar av det. Där är det inga problem att göra sådana här applikationer. Men i gammal möglig asp är det lite tunt utbud..Sv:Problem med AJAX lösning...
Om man skulle göra det med ASP.NET och IIS7, hur skulle den här enkla funktionen se ut då?Sv: Problem med AJAX lösning...
Fulast är att "polla" databasen (gå å frågan den lite då och då om något hänt), finare är att skapa någon form av "trigger" i databasen som asp.net kan reagera på. (Om det är den här applikationen som uppdaterar i databasen är det dock enklare, egentligen är det då inte intressant att veta när databasen har blivit uppdaterad utan när applikationen har uppdaterat databasen. Och det vet ju applikationen.)
Klienten behöver sedan bara skapa ett anrop till den här sidan, och när den returnerar så kollar den om det var en timeout eller inte, om det inte var det så gör den någonting vettigt med resultatet. Sedan skapar den ånyo ett nytt anrop mot servern, och håller på så i all evighet.
Knöligt att förklara, men poängen är att man vill minimera antalet trådar som exekverar. (En anslutning som inte har något att exekvera behöver ingen tråd, bara lite minne. Så fort den börjar exekvera någonting, t.ex. att kolla i en databas, så behövs dock en tråd, och det är fy-fy. Bättre då att databasen säger till när någonting har hänt)Sv: Problem med AJAX lösning...
setTimeout("test()", 0000)
0 ms delay! alltså du pollar maximalt mycket, med minimal delaytid, hela tiden, utan slut..
Inte alls bra. Dessutom anropas en function som gör
xmlHttp=new XMLHttpRequest();
Dvs du skapar ett nytt ActiveX-objekt oändligt antal gånger i en loop med 0 ms mellanrum.
(dvs så fort som klientdatorn orkar med). Inte konstigt att det blir problem.
Det borde räcka fint att du pollar sådär 3 ggr/sekund?
Skriv då:
var x = setTimeout("test()", 333) // vänta 0,333 sek
// (var x = innebär att det ska köras i bakgrunden!)
OCH framför allt: Skapa inte en NY xmlHttp=new XMLHttpRequest();
var n:te millisekund.. Utan lägg det utanför funktionen som du loopar här.
Det räcker ju att du har EN st xmlHttp-instans på sidan.Sv:Problem med AJAX lösning...
Nu har jag fått bra förklaringar på vad som är problemet och hur jag kan göra detta på bästa sätt.