Kollision globales HttpRequestObjekt

serializable

Mitglied
Moin,

ich habe eine Textarea, die jeden Character einzeln an den Server sendet. Der Server sendet dann Daten zurück. Der Anwender sieht den eingegebene Text , die Anzahl der Zeichen etc.

Um Kollisionen zu vermeiden speichere ich meine Chars erst in einen Buffer:

var buffer = new Array() ; //Globales Array

Daten eintragen: buffer.push(idname+"="+data);

Daten entnehmen : var bufferfirst = buffer.shift();

Jetzt sage ich der Callback Funktion: Wenn Array nicht leer , rufe nochmals die Funktion zum Senden auf:

if (buffer.length > 0)
setTimeout( "sendData(idname);", 500 );

Leider haut das so nicht ganz hin, denn der Text blinkt recht stark und ist am Ende verschwunden, er wird nicht mehr angezeigt. Irgendwo ist da ein Haken ...

Hätte hier jemand einen Tipp. Kann ich es vlt. anders besser machen ?

Danke
 
Code:
// Rufe die Funktion bei neuen Zeichen auf
function sendeCharacter( idname, data ) {
    
    var xml = new XMLHttpRequest();
    xml.send( "GET", "bla.php?data=" + data + "&idname=", true );
    xml.onreadystatechanged = function() {
        if( xml.readyState == 4 ) {
            insertData( idname, data, xml.responseText );
        }
    };
    xml.open( null );
}

function insertData( idname, data, response ) {
    // Füge die Daten aus response an einer Positon
    // abhängig von idname ein. Wenn ID-Name die Position war,
    // dann etwa:
    myTextBox.insertAt( idname, response );
}
 
moin,

vielen Dank. Ich sehe, dass Deine Lösung darin besteht, für jeden Aufruf ein eigenes Request Objekt zu erzeugen. Jedes Zeichen hätte dann ein eigenes Objekt.

Ist das denn sinnvoll ? Die Kollision könnte dann vermieden werden. Dafür wärendann mehrere Objekte zur gleichen Zeit im Einsatz.
 
Gegenfrage, spricht was dagegen, wenn mehrere Anfragen parallel ausgeführt werden? Falls eine Anfrage mal länger dauert, werden wenigstens die nächsten bereits durchgeführt...
 
Ja, ich führe die komplette Geschäftslogik auf dem Server um. Der String ist ein Anzeigentext. Ich zähle die Zeichen, daraus ermittle ich die Anzahl der Zeilen und den daraus resultierden Preis. Diese Daten gebe ich dann mit JSON an den Client zurück.

Das ist natürlich ein sehr ressourcenintensiver Vorgang, aber es ist wohl immer besser solcherlei Berechnungen serverseitig zu platzieren. Das ganz soll dann noch um eine Worterkennung erweitert werden.

Du schreibst in deiner Anzeige : Zimmer und bekommst den Vorschlag Zimmer durch Zi zu kürzen.

Wie sollte ich es sonst machen. Ich könnte den String komplett versenden, doch dann entfallen die Features mit der Preisübersicht. Was denkst Du Gumbo ?

@onlyFoo : Ich werde das mal probieren. Wenn das läuft, ist das nicht schlecht.
Was dagegen sprechen würde wäre die Speicherauslastung des Anwender-Rechners
Frage: Wie lange würde so ein Objekt denn im Speicher gehalten ?

Kann ich vielleicht vorbeugen und das Objekt löschen, wenn es nicht mehr benötigt wird ?


Viele Grüße
 
Aber du kannst doch nicht anhand nicht zusammenhängender Zeichen erkennen, was der Benutzer schreibt. Die einzelnen Zeichen könnten in einer anderen Reihenfolge beim Server ankommen oder der Benutzer vertippt sich und korrigiert dies sofort. Dann könnte die ankommenden Zeichen beispielsweise das Wort „Zimmre“ (da er zuerst „Zimmr“ geschrieben und dann durch Einfügen zu „Zimmer“ korrigiert hat). Da ist es sinnvoller den gesamten Text zu schicken.
 
Um das Löschen der nicht mehr referenzierten Objekte kümmert sich Javascript schon alleine, da musst du dir keine Sorgen machen, abgesehen davon machen ein paar Anfragen nichts aus... Es sollten ja ohnehin nicht mehr als zwei oder drei Anfragen zu gleich aktiv sein, denn sonnst scheint den Server bzw des serverseitige Skript oder die Verbindung zu langsam zu sein...

Du könntest auch die Preisübersicht und Tipps lokal berechnen und dann nur beim Absenden der Daten nocheinmal vom Server gegenprüfen lassen, das wär denke ich die beste Lösung.

(Und ich denke nicht, dass das zuviel Leistung oder Speicher auf dem Client frisst... solange deine Liste mit Abkürzungen nicht mehr als 20k Einträge enhält ^.^ ... Ich habe Bitmaps in der Größe 1024x1024px bei 32bit (also etwa vier Megabyte) in Javascript geladen und in ein Array umgewandelt... das dauerte kaum ne Sekunde)
 
Ok. Ich werde also bei meiner Strategie mit dem einen Objekt bleiben und den Text beim verlassen der Textarea übertragen. Ist wohl am Sinnvollsten. Mal sehen ob ich dann doppelten Code in JS und PHP verwende.

Wobei :

Ich übertrage nicht jedes Zeichen einzeln, sondern nach jedem eingegenen Zeichen den gesamten Inhalt der Textarea.

also: Zim , Zimm, Zimme .......

Ein Wort wird immer mit einem Leerzeichen abgeschlossen. Der Suchstring ist demnach der String zwischen den Leerzeichen. Suchen muss man dann nur wenn der übertragene String größer ist als der Gespeicherte.

Jetzt ist doch die Frage : Stören die 120 Anfragen an den Server oder ist die doppelte Implementierung in JS und PHP eher problematisch.

Für die Speicherung meines Abkürzungsverzeichnisses habe ich eine mySQL-Datenbank aufgebaut.

Meinst Du, wenn ich es hinbekomme, dass er mir so alle Zeichen üerbträgt, dass es auch gut wäre, immer den aktuellen String auf dem Server zu haben ?

Imerhin hab ich dann immer den aktuellen Zustand des Programms geladen: Es können keine Daten verloren gehen...
 
Zurück