2

私は基本的なプッシュメッセージングシステムを書いています。小さな変更により、正常に動作しなくなりました。説明させてください。私の元のバージョンでは、次のようなドキュメントのコードを入れることができました。

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

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

これはうまく機能し、サーバーがnullを返した場合でも接続を開いたままにします(2分のタイムアウトの後)。getJSON関数を無期限に何度も呼び出し続けるだけです。ハッピーパンダ。

ここで、タグの間にコードセグメントを配置する必要があります。$(document).ready()関数へのアクセスはほとんど機能しません。

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

これは機能します...しばらくの間。その後まもなく、check4Updatesの呼び出しを停止し、無限ループに入り、100%のプロセッサ時間を使用します。

ページが閉じるまでcheck4Updatesが繰り返し呼び出されるように取得しようとしています。私の単純な変更が期待どおりに機能しなくなった理由について誰かが洞察を持っている場合は、私に知らせてください。読んで助けてくれてありがとう。

よろしく、ヴァングエン

4

4 に答える 4

7

ええ、あなたはそのループを使いたくないでしょう。クライアントをロックすることは言うまでもなく、あなたは自分自身をDOSすることになります。

シンプルに、ポーリング プラグインを作成します。

ソース: http://web.archive.org/web/20081227121015/http://buntin.org:80/2008/sep/23/jquery-polling-plugin/

使用法:

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

それをバックアップするコード:

(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);
于 2009-04-30T23:11:29.463 に答える
0

これはサーバープッシュについてだと思いますか?

Socket.IOを使ってみませんか?

参照:Socket IO 0.9の紹介、Googleグループ(http://socket.io/

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

参照:websocket、Node.js、jQueryを楽しんでください(http://nayna.org/blog/?p=159

于 2013-01-14T03:23:02.580 に答える
0

タイムアウトを使用してください。これらのタイプのループは非常に悪い考えです。そのため、何らかの理由でポーリングを使用する必要がある場合は、バックエンドを叩き続けないようにしてください。

于 2009-04-30T22:39:09.340 に答える
0

altCognito で説明されているようにポーリング方法に変更する必要があるか、サーバーからクライアントにデータをプッシュするように設計された comet を使用できます。必要に応じて、Jetty (Java 用)、Twisted (Python)、WebSync (ASP.NET/IIS)などを使用できます。

于 2010-01-10T16:42:26.873 に答える