ホームページ  >  記事  >  ウェブフロントエンド  >  簡単にnodejsサーバーを作成する(8): ノンブロッキングの実現方法_node.js

簡単にnodejsサーバーを作成する(8): ノンブロッキングの実現方法_node.js

WBOY
WBOYオリジナル
2016-05-16 16:25:511077ブラウズ

このセクションでは、nodejs がノンブロッキング操作を実装する方法を見ていきます。

まず開始ハンドラーを変更しましょう:

コードをコピーします コードは次のとおりです:

var exec = require("child_process").exec;
関数 start() {
console.log("リクエストハンドラー「start」が呼び出されました。");
var content = "空";
exec("ls -lah", function (error, stdout, stderr) {
content = stdout;
});
コンテンツを返す;
}

関数アップロード() {
console.log("リクエストハンドラー「アップロード」が呼び出されました。");
"こんにちはアップロード" を返します;
}

exports.start = 開始;
exports.upload = アップロード;

このコードは、新しい変数 content (初期値は「空」) を作成し、「ls -lah」コマンドを実行し、結果を content に代入し、最後に content を返します。

新しい Node.js モジュール child_process を導入しました。これは、シンプルで実用的なノンブロッキング操作 exec() の実装に使用されます。

では、exec() は何をするのでしょうか?

Node.jsからシェルコマンドを実行します。上記の例では、現在のディレクトリ (「ls -lah」) にあるすべてのファイルを取得し、/startURL が要求されたときにファイル情報をブラウザに出力するために使用しています。

サーバーを起動して「http://localhost:8888/start」にアクセスすると、ページの出力コンテンツが空であることがわかります。

exec() を使用すると、アプリケーションを強制的に停止して操作を待機させることなく、非常に時間のかかるシェル操作を実行できます。

それでも、ページによって出力されるコンテンツは私たちが望む結果ではないようです。

その理由を分析してみましょう:

コードは同期的に実行されます。つまり、exec() を呼び出した後、Node.js は返されたコンテンツをすぐに実行します。

この時点では、exec() に渡されたコールバック関数がまだ実行されていないため、コンテンツはまだ「空」です。これは、exec() の操作が非同期であるためです。

この問題を解決する方法を次のセクションで紹介します。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。