Node.jsでノンブロッキングコードを作成する方法を調べるために、たくさんの検索をしました。残念ながら、私が見つけたすべての例は、最終的にはすでにコールバックが組み込まれている関数に基づいています。だから私は自分の関数をコールバックで作成したかったのですが、何らかの理由でイベントループをブロックしていました。これは、イベントループブロックされませんでした:Node.js:イベントループをブロックしないで 'setTimeout'関数をどのように再作成しますか?
function foo(response){
setTimeout(function(){
response.writeHead(200, {"Content-Type": "text/plain"});
response.write("bar");
response.end();
}, 7000);
}
をしかし、これはやった:私は、根本的な何か非ブロッキングコードの様相を
function foo(response){
function wait(callback, delay){
var startTime = new Date().getTime();
while (new Date().getTime() < startTime + delay);
callback();
}
wait(function(){
response.writeHead(200, {"Content-Type": "text/plain"});
response.write("bar");
response.end();
}, 7000);
}
行方不明ですか?
編集:
のsetTimeoutを再作成する私の目標は、私は私が、私も少し良くループを理解することができます試してみようと思いましたメンタルエクササイズの詳細です。今、私は、JavaScriptで生の処理をしているかなり重いサーバー側のコードがあると、イベントループを停止させないようにする方法を知りません。
答えを読んでもう少し考えてみると、より正確な質問が出てくる可能性があります。JavaScriptでサーバーを処理している場合、イベントループを中断する方法を教えてください?
私はここに初めて投稿したので、どんな反応が得られるのか分かりませんでした。これまでのところ、これは素晴らしいです。みんなありがとう。
編集2: お元気ですか、アドバイスありがとうございます。私はレイノスが提案したようにprocess.nextTickを試してみることになった。私は自分のノンブロッキングタイマーをコールバックで作成することができました。コードは完璧ではありませんが、興味がある人のために、これはそれがどのように見えるかです:
var timer = {};
function delay(callback, length){
if(!timer.startTime){
timer.startTime = new Date().getTime();
timer.callback = callback;
timer.length = length;
}
if(new Date().getTime() < timer.startTime + timer.length){
process.nextTick(delay);
} else {
timer.callback();
timer = {};
}
}
function list(response){
delay(function(){
console.log("callback");
exec("dir", function (error, stdout, stderr) {
response.writeHead(200, {"Content-Type": "text/plain"});
response.write(stdout);
response.end();
});
}, 7000);
}
は本当にこのコードを使用することを意図していません。しかし、これを行う方法を学ぶプロセスは、ノンブロッキングに関するいくつかの重要な概念を理解するのに役立ちました。
と非ブロッキングについてはまだ好奇心あなたのそれらのために、あなたはあなたのコードは、最終的にイベントループに戻り、それが処理を継続できるようにするために持っているイベントループを遮断しないようにするためにはRaynos' article.
'bodyless while loop' ..."ノンブロッキングコードの基本的な側面は何ですか? –
'setTimeout'を再作成しようとしてはいけません。ちょうどそれを使用してください。それはこの目的のために作られました。 – david
私は、イベントループを継続させるためにsetTimeoutが何をするかをより深く理解することを考えました。 JavaScriptサーバ側で重い処理をしなければならないのであれば、私は同じ方法を使うことができます。 – Craig