編集:閉じることができます。 Isn't truly asynchronous, non-blocking javascript impossible?Node.jsは実際にバックグラウンドI/Oタスクを非同期で処理しますか?
var PATH = require ("path");
var URL = require ("url");
var sleep = function (ms){
var start = new Date().getTime();
while ((new Date().getTime() - start) < ms);
}
require ("http").createServer (function (req, res){
if (URL.parse (req.url).pathname === "/1"){
console.log ("tab 1: I'm in");
PATH.exists ("test", function (exists){
sleep (5000);
res.writeHead (200, {"Content-Type": "text/plain"});
res.end ("1");
console.log ("tab 1: I'm done");
});
}else{
console.log ("tab 2: I'm in");
res.writeHead (200, {"Content-Type": "text/plain"});
res.end ("2");
console.log ("tab 2: I'm done");
}
}).listen (80);
- ファイルに内容をコピーします。
- ファイルを実行します。
- ブラウザで新しいタブを開きます。 URLを
localhost/1
に設定します。まだ行かないでください。 - ブラウザで新しいタブを開きます。 URLを
localhost/2
に設定します。まだ行かないでください。 - 最初のタブに戻ります。 enterを押して、2番目のタブに変更した直後にenterを押します。
結果:
コンソールログ:
タブ1:私は
タブ1にいる:私は終わりだ
タブ2:私は
タブによ2:完了しましたタブ1は結果 "1"を受け取るのを5秒待っています。
- タブ2は、タブ1が5秒間スリープしているので、5秒間待たなければなりません。
docsは、コード以外のすべてが非同期であると言います。 1つのスレッドのみ。一度に1つのリクエストのみ。リクエストはエンキューされます。
I/Oコールは非同期であると想定されます。コールバックが非同期I/Oプロセスから来た場合、なぜタブ2がタブ1を待たなければならないのですか?
ありがとうございました。
ノード内に偽の 'sleep'メソッドがある* ragequit * – jAndy