Die Aufrechterhaltung einer jQuery .getJSON () Verbindung offen und warten, während in Körper einer Seite?

StackOverflow https://stackoverflow.com/questions/809434

Frage

Ich schreibe ein grundlegendes Push-Messaging-System. Eine kleine Änderung hat dazu geführt, es in Wirk richtig zu stoppen. Lassen Sie mich erklären. In meiner ursprünglichen Version konnte ich den Code in dem ein Dokument, so etwas sagen:

<head>
  ...text/javascript">
  $(document).ready(function(){
    $(document).ajaxStop(check4Updates);
    check4Updates();
  });

  function check4Updates(){
    $.getJSON('%PATH%', callback);
  };
...
</head>

Das funktionierte gut und würde die Verbindung offen halten, auch wenn der Server return null (was sie nach 2 Minuten Timeout sagen würden). Es wäre nur halten die getJSON Funktion immer und immer wieder auf unbestimmte Zeit aufrufen. Glücklicher Panda.

Nun muss ich das Code-Segment zwischen Tags setzen. Der Zugriff auf die $ (document) .ready () Funktion wird ziemlich viel nicht.

<body>
...
check4Updates();
$("body").ajaxStop(check4Updates);
...
</body>

Das funktioniert ... für eine Weile. Kurz danach wird es aufhören check4Updates Aufruf und in eine Endlosschleife bekommen und 100% Prozessorzeit verwenden.

Ich versuche, es zu bekommen, so dass check4Updates wiederholt, bis die Seite geschlossen wird, aufgerufen wird. Wenn jemand irgendwelche Erkenntnisse darüber, warum meine einfache Änderung hat nicht mehr wie erwartet funktionieren, lassen Sie es mich wissen. Vielen Dank, dass Sie sich die Zeit nehmen zu lesen, und helfen Sie mir.

Mit freundlichen Grüßen, Van Nguyen

War es hilfreich?

Lösung

Ja, Sie gehen zu wollen nicht, dass die Schleife verwenden, bist du ziemlich viel http://web.archive.org/web/20081227121015/http://buntin.org:80/2008/sep/23/jquery-polling-plugin/

Verbrauch:

$("#chat").poll({
    url: "/chat/ajax/1/messages/",
    interval: 3000,
    type: "GET",
    success: function(data){
        $("#chat").append(data);
    }
});

Der Code um es wieder auf:

(function($) {
    $.fn.poll = function(options){
        var $this = $(this);
        // extend our default options with those provided
        var opts = $.extend({}, $.fn.poll.defaults, options);
        setInterval(update, opts.interval);

        // method used to update element html
        function update(){
            $.ajax({
                type: opts.type,
                url: opts.url,
                success: opts.success
            });
        };
    };

    // default options
    $.fn.poll.defaults = {
        type: "POST",
        url: ".",
        success: '',
        interval: 2000
    };
})(jQuery);

Andere Tipps

Verwenden Sie ein Timeout, diese Arten von Schleifen sind eine wirklich schlechte Idee, wenn Sie also Abfrage aus irgendeinem Grund verwenden müssen, stellen Sie sicher, dass Sie nicht halten Sie Ihre Back-End-Hämmern.

Sie müssen entweder auf eine Abfragemethode ändern, wie durch altCognito beschrieben, oder Sie können Komet verwenden, die Daten vom Server wurde entwickelt, um den Client zu schieben. Je nach Bedarf können Sie so etwas wie Jetty (für Java) oder Twisted (Python) oder WebSync verwenden (ASP.NET/IIS)

Ich denke, dass dieser über Server-Push ist?

Wie wäre es die Socket.IO mit?

Ref: Einführung Socket-IO 0.9, Google-Gruppe ( http://socket.io/ )

Ref: http: // techoctave.com/c7/posts/60-simple-long-polling-example-with-javascript-and-jquery

Ref: Spaß mit WebSockets, Node.js und jQuery ( http://nayna.org/blog /? p = 159 )

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top