ホームページ ウェブフロントエンド jsチュートリアル Node.js チャット プログラムは Ajax ロングポーリング ロング リンク リフレッシュ モードをどのように実装しますか_javascript スキル

Node.js チャット プログラムは Ajax ロングポーリング ロング リンク リフレッシュ モードをどのように実装しますか_javascript スキル

May 16, 2016 pm 05:55 PM
chat node.js

早速、今日の話題を始めましょう。このプログラムを見て、最も価値があるのは、nodejs を使用してロングリンク モードのリフレッシュ技術を実装する方法を示していることだと感じます。
(このプログラムは詳しく紹介しませんが、この関数に焦点を当てます)
Client.js

コードは次のとおりです。

、dataType: "json"
、データ: {since: CONFIG.last_message_time、id: CONFIG.id }
、エラー: function () {
addMessage("", "ロングポーリングエラー。再試行しています...", new Date(), "error");
transmission_errors = 1;
//エラー時にサーバーをフラッディングしないでください。再試行する前に 10 秒待ってください。
setTimeout( longPoll, 10*1000);
}
, success: function (data) {
transmission_errors = 0;
//すべてがうまくいった場合は、すぐに別のリクエストを開始します
//応答には長い時間がかかります
//どのくらいかかりますか?別のメッセージがあるまで待機します
//その後、メッセージを返して接続を閉じます
//データを取得すると接続が閉じられ、再度longPollします。
longPoll(data);
}
})


これはクライアントのコードです。 .js このコードを見ると、すぐに「再帰」という 2 つの単語が思い浮かぶはずです。 longPoll メソッドで、longPoll メソッドを再度呼び出します。これは一般的な再帰呼び出しです。
このコードのセマンティクスに基づくと、初めてロードするときに、longPoll メソッドが呼び出されて、「/resv」から値を非同期的に取得し、成功すると、success メソッドが実行されます。 longPoll メソッドはすぐに再度呼び出されます。失敗した場合は、エラー関数を実行し、10 秒ごとに longPoll メソッドを再度呼び出します。もちろん、error メソッドを実行できる回数には一定の制限があり、これは変数transmission_errorsxによって制御されます。
質問があるかもしれませんが、データを取得するために再帰的にループすることでサーバーに負担がかかりますか?取得するデータがない場合でも、このサイクルは続くのでしょうか?もちろん、答えはノーです!さらに、nodejs は独自の特性を使用して、この問題をうまく解決します。次に、
Server.js
サーバーが上記のクライアント呼び出しにどのように応答するか、コア コードを見てみましょう:



コードをコピー


コードは次のとおりです:
fu.get("/recv", function (req, res) { //セッションの検証と更新... channel.query(since, function (messages) { if (セッション) session.poke(); res.simpleJSON(200, {messages:messages, rss: mem.rss }); });
});


fu.get() が何を意味するかについては、このチュートリアルとは関係ありません。つまり、クライアントの呼び出しに応答できるということだけを知っておいてください。上記のコードは、セッションに対するいくつかの操作に加えて、チャネルのクエリ メソッドを呼び出すだけです。渡されるパラメータに注意してください:
since は時間を記録します。
匿名メソッドはメッセージ パラメータと 2 つのアクションを受け取ります: 1. セッション時間を更新します。 2. json を返します。つまり、メッセージを返します。クライアントに。
ここでメッセージを直接返すことはできないのですか? 操作するためにチャネル内でメソッドを定義する必要があるのはなぜですか?回答: その場合、返す情報がない場合でも、サーバーとクライアントは常にデータと対話します。
読んでみましょう!
チャネルの定義方法を確認します:



コードをコピーします


コードは次のとおりです:

var MESSAGE_BACKLOG = 200,
SESSION_TIMEOUT = 60 * 1000;
var チャネル = 新しい関数 () {
var メッセージ = [],
コールバック = this.appendMessage = function (nick, type, text) {
var m = { nick: ニック
, type: type // "msg", "join", "part"
, text: text
、タイムスタンプ: (new Date()).getTime()
};
switch (type) {
case "msg":
sys.puts("<" nick) "> " text);
break;
case "join":
sys.puts(nick " join");
case "part":
sys .puts(ニック " 部分");
break;
}
messages.push( m );
//shift() メソッド配列の最初の要素を削除し、最初の要素の値を返すために使用されます
callbacks.shift().callback([m]);
}
while (messages.length > ; MESSAGE_BACKLOG )
messages.shift();
};
this.query = function (since, callback) {
varmatching = []
for (var i = 0; i var message =messages[i]
if (message.timestamp > because)
matching.push(message)
; .length != 0) {
callback(matching);
} else {
callbacks.push({ timestamp: new Date(), callback: callback }); ;
// 古いコールバックをクリアします
// 最大 30 秒間待機できます。
var now = new Date();
while (コールバック) .length > 0 && now - callbacks[0].timestamp > 30*1000) {
}
}; >};


チャネルには、3 秒ごとに実行される 2 つの変数、2 つのメソッド、および setInterval 関数が定義されています。
まずクエリ メソッドを見てみましょう。
クエリ メソッドは 2 つのパラメータを受け取ります:
since: 時間を記録します
callback: 上記の channel.query メソッドを呼び出すときに渡される匿名関数 (JS の場合) , 関数はパラメータとして渡すことができ、受信後に直接呼び出すことができます。)
現在のチャット レコード キューはメッセージに保存されており、クエリ メソッドは条件を満たすチャット レコードを見つけて配置します。キューにあります。 matching.length>0 の場合、コールバックで受け取った関数が呼び出されます。つまり、マッチングが JSON 形式でクライアントに返されます。しかし。 。 。次に重要なポイントです! ! !



コードをコピーします


コードは次のとおりです:

if (matching.length != 0) { callback(matching); } else { callbacks.push({ timestamp: new Date(), callback: callback }); if matching.length では、この状態を永遠に続けることはできません。誰かが毎秒チャット メッセージを送信してきたらどうしますか?
次に、appendMessage (チャット メッセージの追加) メソッドを見てください。
このメソッドの最初の部分は、受信パラメーターを受け取り、それらを組み合わせて m セットを作成し、それを使用するだけです。 sys.puts を実行して、メッセージ チャット メッセージ キューに m を挿入します。次が重要なポイントです:




コードをコピーします


コードは次のとおりです:


while (callbacks) .length > ; 0) {
//shift() メソッドは、配列の最初の要素を削除し、最初の要素の値を返すために使用されます callbacks.shift().callback([m]); } 次に、コールバックが保存されているかどうかを判断する必要があります。保存されている場合は、1 つを実行し、実行が完了するまで 1 つを削除します。返されるチャット メッセージがなくなる前に、誰かがリクエストを行っても、システムはこれらのリクエストを実行せず、コールバック リストに追加しなかったためです。 誰かがチャット メッセージを送信したので、add メソッドを実行するときに、未実行のリクエストをすべて再度実行する必要があります。
一般的な理解は次のとおりです。「あなたは私にリクエストを送信しましたが、返信する新しいメッセージはまだありません。誰かが新しいメッセージを送信したら、すぐに返信します。」
理解できるかわかりませんが。 。 。
このステップは完了です。最後のステップは、期限切れのコールバックを 3 秒ごとにクリアすることです。これは理解するのが難しくありません。
概要
Nodejs は、独自のイベント駆動型言語機能を使用して、長いリンクの更新機能を実装しています。これにより、目を覚ますことができます。とても恩恵を受けたと感じています。時間をかけてチュートリアルを書いて皆さんと共有し、私自身の理解を深めたいと思います。
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Node V8 エンジンのメモリと GC の詳細な図による説明 Node V8 エンジンのメモリと GC の詳細な図による説明 Mar 29, 2023 pm 06:02 PM

この記事では、NodeJS V8 エンジンのメモリとガベージ コレクター (GC) について詳しく説明します。

Nodeのメモリ制御に関する記事 Nodeのメモリ制御に関する記事 Apr 26, 2023 pm 05:37 PM

ノンブロッキングおよびイベント駆動に基づいて構築されたノード サービスには、メモリ消費量が少ないという利点があり、大量のネットワーク リクエストの処理に非常に適しています。大量のリクエストを前提として、「メモリ制御」に関する問題を考慮する必要があります。 1. V8 のガベージ コレクション メカニズムとメモリ制限 Js はガベージ コレクション マシンによって制御されます

Microsoft 365 Copilot、Bing Chat Enterprise、Windows の Copilot の主な違い Microsoft 365 Copilot、Bing Chat Enterprise、Windows の Copilot の主な違い Sep 23, 2023 pm 03:57 PM

現在、Microsoft は企業顧客に Microsoft365Copilot、BingChatEnterprise、Windows の Copilot の 3 つの異なる AI アシスタントを提供しています。これら 3 つのオプションの違いについて説明したいと思います。 CopilotinWindows: Windows の Copilot は、タスクをより速く簡単に完了するのに役立つ強力なツールです。タスクバーから、または Win+C を押すことによって Copilot にシームレスにアクセスでき、使用するアプリケーションの横にヘルプが表示されます。 Windows の Copilot は、新しいアイコン、新しいユーザー エクスペリエンス、BingChat を備えています。 2になります

最適な Node.js Docker イメージを選択する方法について話しましょう。 最適な Node.js Docker イメージを選択する方法について話しましょう。 Dec 13, 2022 pm 08:00 PM

ノード用の Docker イメージの選択は些細なことのように思えるかもしれませんが、イメージのサイズと潜在的な脆弱性は、CI/CD プロセスとセキュリティに大きな影響を与える可能性があります。では、最適な Node.js Docker イメージを選択するにはどうすればよいでしょうか?

Node の File モジュールについて詳しく説明しましょう Node の File モジュールについて詳しく説明しましょう Apr 24, 2023 pm 05:49 PM

ファイル モジュールは、ファイルの読み取り/書き込み/開く/閉じる/削除の追加など、基礎となるファイル操作をカプセル化したものです。ファイル モジュールの最大の特徴は、すべてのメソッドが **同期** と ** の 2 つのバージョンを提供することです。 asynchronous**、sync サフィックスが付いているメソッドはすべて同期メソッドであり、持たないメソッドはすべて異種メソッドです。

Nodeのイベントループについて話しましょう Nodeのイベントループについて話しましょう Apr 11, 2023 pm 07:08 PM

イベント ループは Node.js の基本的な部分であり、メイン スレッドがブロックされていないことを確認することで非同期プログラミングが可能になります。イベント ループを理解することは、効率的なアプリケーションを構築するために重要です。次の記事では、Node のイベント ループについて詳しく説明します。お役に立てれば幸いです。

ノードがnpmコマンドを使用できない場合はどうすればよいですか? ノードがnpmコマンドを使用できない場合はどうすればよいですか? Feb 08, 2023 am 10:09 AM

ノードが npm コマンドを使用できない理由は、環境変数が正しく設定されていないためです。解決策は次のとおりです: 1. 「システムのプロパティ」を開きます; 2. 「環境変数」->「システム変数」を見つけて、環境を編集します。変数; 3.nodejs フォルダーの場所を見つけます; 4.「OK」をクリックします。

ノードのバッファーについて詳しく見る ノードのバッファーについて詳しく見る Apr 25, 2023 pm 07:49 PM

当初、JS はブラウザ側でのみ動作していたため、Unicode でエンコードされた文字列の処理は簡単でしたが、バイナリ文字列や非 Unicode エンコード文字列の処理は困難でした。バイナリは、コンピュータのビデオ/オーディオ/プログラム/ネットワーク パッケージの最低レベルのデータ形式です。

See all articles