jQuery Long Polling (mit PHP Server Seite)

8

Ich habe hier einen Albtraum, also würde jede Hilfe dankbar sein! Zuerst werde ich erklären, was ich versuche zu tun:

Ich versuche ein System wie das hier beschriebene zu implementieren: Ссылка auf meinem localhost MAMP-Server mit Yii-Framework. Ich habe eine Funktion, die überprüft, ob es neue Benachrichtigungen in der DB gibt - wenn ja, analysiert sie sie und json codiert sie. Ich habe diese Funktion alle 5 Sekunden in einer while-Schleife aufgerufen.

Also: Gehen zu / user / unreadNotifications löst das folgende

aus %Vor%

Das funktioniert gut - gegangen auf den Link im Browser und verifizierte JSON-Antwort - alles gut.

Ich habe dann alle möglichen jQuery-Sachen ausprobiert, um es zum Laufen zu bringen ... Der einzige Weg, den ich gefunden habe, ist $.ajax mit dem Typ POST zu verwenden, aber NUR, wenn es eine wartende Benachrichtigung gibt (also wird json zurückgegeben) . $.get oder $.post wird "abgebrochen" (angezeigt in firebug), aber die URL wird aufgerufen (weil ich sehen kann, dass die Protokolldatei aktualisiert wird) - odd.

Meine ursprüngliche Konfiguration mit $.get ist:

%Vor%

Dies wird aus irgendeinem Grund einfach "abgebrochen". Ich habe mit 'jsonp' versucht, obwohl es keine CORS-Anfrage ist .. aber das funktioniert auch nicht.

Damit scheint es nicht weiter zu gehen! Kann jemand eingreifen?

Vielen Dank

    
cud_programmer 02.07.2012, 15:50
quelle

4 Antworten

3

Wie wäre es damit? Ich nehme an, das $. (Get) ist in einer Funktion namens notificationPoll (); welches nach Beendigung einmal aufgerufen wird.

%Vor%

Ich habe es getan und immer hier ausgeführt, wie jQuery sagt, ist Erfolg abwertend: fail:

    
Waygood 02.07.2012 16:34
quelle
3

Sie müssen sicher sein, dass die Funktion innerhalb einer angemessenen Zeit beendet wird. Was Sie tun könnten, ist dies:

%Vor%

Sie haben die Abruffunktion mit setInterval () als Timer eingerichtet. Die Funktion wird jetzt alle 10 Sekunden aufgerufen, und Sie müssen möglicherweise ein Semaphor einrichten, um zu vermeiden, dass es aufgerufen wird, bevor die vorherige Iteration zurückgegeben wurde:

%Vor%

Dann muss die Polling-Funktion in AJAX überprüfen (in der .done() ) Callback), dass die Benachrichtigung dort ist:

%Vor%

Eine wichtige Sache ist jetzt Wie sieht Ihre Benachrichtigung aus? Hier habe ich angenommen, dass es sich um eine JSON-codierte string handelt. Wenn es sich jedoch um ein Array oder ein Objekt handelt, das von der Yii-Funktion zurückgegeben wird, müssen Sie mit der Codierung umgehen. Dies könnte sogar sauberer sein, ohne irgendwelche IFs:

%Vor%

Die Decodierung wird bereits von jQuery gehandhabt, daher ist die obige Variable "data" bereits ein Javascript-Objekt und Sie müssen JSON.parse nicht aufrufen. Sie können jedoch überprüfen, ob data ein Objekt ist und ob es die erwarteten Eigenschaften aufweist. Das wird Sie vor Fehlern warnen.

Um die Navigation zu einer anderen Seite zu ermöglichen, können Sie die setInterval() -gelieferte Timer-ID der JavaScript-Abfragefunktion in einer globalen Variablen speichern und den Timer löschen, wenn die Seite onUnload() aufruft, um die Abfrage zu deaktivieren.

    
LSerni 23.10.2016 12:02
quelle
2

Was werden die getNotifications zurückgeben, wenn keine Benachrichtigungen vorhanden sind? jQuery erwartet, dass ein JSON-Format zurückgegeben wird. Wenn Sie jedoch nur eine leere Zeichenfolge ausgeben, schlägt die Anforderung fehl, da das Format der Antwort kein JSON ist. Stellen Sie sicher, dass die JSON-Zeichenfolge jedes Mal wiederholt wird.

    
Andy 02.07.2012 16:12
quelle
1

Ich bin daran interessiert, dass der Code abbricht und vielleicht gibt es Ihre Antwort. Es kann aufgrund mehrerer Gründe auftreten

  • Query.get ist fehlgeschlagen. Ajax-Anruf funktioniert aus irgendwelchen Gründen nicht. Parsing Fehler.
  • Schlechte JavaScript-Syntax. Beispiel: Der Code im Erfolgshandler erwartet die Ereigniseigenschaft im Eingabeargument, die möglicherweise nicht wahr ist.

Für jQuery.get, wie in der Dokumentation zu jQuery.get ( Ссылка ) vorgeschlagen, kann die Funktion automatisch fehlschlagen Ich werde vorschlagen, .ajaxError zu verwenden, um zu sehen, ob der get fehlschlägt.

  

Wenn eine Anfrage mit jQuery.get () einen Fehlercode zurückgibt, schlägt sie im Hintergrund fehl, es sei denn, das Skript hat auch die globale Methode .ajaxError () aufgerufen. Alternativ steht ab jQuery 1.5 auch die Methode .error () des von jQuery.get () zurückgegebenen jqXHR-Objekts zur Fehlerbehandlung zur Verfügung.

Bei JavaScript-Syntaxfehler werde ich vorschlagen, den Firebug-Debugger zu durchlaufen. Fügen Sie in der ersten Zeile des Erfolgshandlers einen Haltepunkt hinzu, und führen Sie dann jede Zeile von dort aus. Es ist mühsam, aber es funktioniert.

    
Jay Rajput 29.10.2016 02:40
quelle

Tags und Links