0

Comet プログラミングは Web 開発者にはほとんど知られており、jQuery は現在市場で最も人気のある JavaScript ライブラリです。右?

ここで、毎秒クライアントにデータをプッシュするサービスがサーバー上にあるとします。C# 言語に基づくサーバー コードの ASP.NET 実装は、次のようになります。

while (true)
{
    Response.Write("{data: 'data from server'}");
    Response.Flush();
    Thread.Sleep(1000);
}

また、ページがブラウザーにロードされた後、jQuery スニペットがサーバーとのキープアライブ HTTP ajax 接続をトリガーし、サーバーがそれらのデータ スニペットをクライアントに送り返すことを想像してみてください。

ここまでは子供の開発者でもできるので全く問題ありません。ただし、jQuery AJAX には、さまざまな機会にトリガーされる多くのコールバック関数があります。successerrorcompleteなど。ただし、これらのメソッドはいずれも、サーバーから送信された JSON ごとに起動されません。つまり、このコードは機能しません:

$(function () {
    $.ajax({
        type: 'GET',
        url: 'url-of-that-service',
        dataType: 'json',
        success: function (result) {
            /*
            Here, I need to get the result sent by 
            the Server, and based on its data, 
            manipulate DOM. For example, imagine
            that server sends its current time
            in JSON format each second. I need
            to parse the sent JSON string, and 
            append the server time somewhere in
            the web page.
            Success function never gets fired for
            these server-pushed data.
            What should I do?
            */
        },
        error: function (error) { }
    });
});

jQuery で最新の更新について通知を受ける 1 つの方法responseTextは、基礎となるxhrオブジェクトをポーリングし、サーバーから送信された最新のデータを定期的にチェックすることです。ただし、イベントベースのアプローチを探して、生きている ajax 接続にフックし、サーバーが何かを送信するたびに通知を受け取ります。

私の質問は、何かがサーバーから到着したことをどのように検出すればよいですか? orを含まないきちんとした方法はありますsetTimeoutsetInterval? jQuery はここで私たちを助ける何かを持っていますか?

4

2 に答える 2

0

sendCometRequestたとえば、 ajaxリクエストを送信する機能があります。サーバーからの応答を続行した後に再度setInterval呼び出す成功コールバックの代わりに、再帰を使用できます。sendCometRequestロングポーリングメソッドとして呼び出します。C#については、この記事を読むことができます。非同期コメットサーバーの良い方法を説明しています。

于 2012-05-05T10:04:48.023 に答える
0

さて、あなたの質問では多くのことが明確ではありません..

しかし、コメットを探しているなら...コメットの堅実で実用的な実装を探し、[thread.sleep()+連続ポーリング]のようなハックを避けるべきだと思います。ユーザー。

.net の場合 - lightstreamer - http://www.lightstreamer.com/

そして、comet が本当に必要かどうかを確認してください。それ以外の場合は、Web ソケットを使用してみてください。

于 2012-05-05T10:16:38.017 に答える