javascriptのsettimeoutと非同期を再認識
4639 ワード
主な意味はjavascriptエンジンが単一スレッドで実行され、whileサイクルが実行されると、settimeoutの関数は実行する機会がなく、whileそこは永遠に真実であり、死のサイクルをもたらすということです.しかし、単純に見るとあまり着実ではなく、最後に実践精神を発揮し、自分で2つの実験をしました.
1、簡単なsettimeout
実行の結果、「end」「end 1」がポップアップされ、ブラウザが偽死し、「end 2」がポップアップされません.すなわち,最初のsettimeoutで実行されるときはデッドサイクルであり,これは理論的にそれより1秒遅れて実行される2番目のsettimeoutの関数がブロックされ,これは私たちが普段理解している非同期関数マルチスレッドと互いに干渉しないことと一致しない.muleを使用してWSDL中国語の文字化けし問題の解決方法を生成する
2、ajax要求コールバック
次にxmlhttprequestによるajax非同期リクエスト呼び出しをテストします.主なコードは次のとおりです.
サービス側で簡単な出力を実現:TP-LINK WR 340 G設定チュートリアル
理論上、ajax非同期要求が、その非同期コールバック関数が単一のスレッドにある場合、コールバック関数は必然的に他のスレッド「妨害」されずに順調に実行され、すなわち1秒後、コールバック実行は「ajax」をポップアップするが、実際の状況はそうではなく、ブラウザが再びデッドサイクルのために偽死したため、コールバック関数は実行できない.
結論:実践結果からjavascriptエンジンは確かに単一スレッドでそのタスクキューを処理している(成果は一般関数とコールバック関数からなるキューであることが理解できるか?)のです.Javascriptで非同期プログラミングを実現するのは大きな障壁法であり、単一スレッドのエンジンでマルチスレッドのプログラミングを実現し、リソースの同期反発などの操作(C#、Javaなどの言語のマルチスレッドなど)を実現するには、本当に実現するのは簡単に保証できないと感じています.
補足:javascriptのsleepをどのように実現しますか?stackoverflowでjavascript sleepを見つけて、試してみましたが、効果はありましたが、実行するときはcpuが高いので、直接settimeoutしたほうがいいですね.
1、簡単なsettimeout
setTimeout(function
() { while
(true
) { } }, 1000);
setTimeout(function
() { alert('end 2'
); }, 2000);
setTimeout(function
() { alert('end 1'
); }, 100);
alert('end'
);
実行の結果、「end」「end 1」がポップアップされ、ブラウザが偽死し、「end 2」がポップアップされません.すなわち,最初のsettimeoutで実行されるときはデッドサイクルであり,これは理論的にそれより1秒遅れて実行される2番目のsettimeoutの関数がブロックされ,これは私たちが普段理解している非同期関数マルチスレッドと互いに干渉しないことと一致しない.muleを使用してWSDL中国語の文字化けし問題の解決方法を生成する
2、ajax要求コールバック
次にxmlhttprequestによるajax非同期リクエスト呼び出しをテストします.主なコードは次のとおりです.
var
xmlReq = createXMLHTTP();// xmlhttprequest
function
testAsynRequest() {
var
url = "/AsyncHandler.ashx?action=ajax"
;
xmlReq.open("post"
, url, true
);
xmlReq.setRequestHeader("Content-Type"
, "application/x-www-form-urlencoded"
);
xmlReq.onreadystatechange = function
() {
if
(xmlReq.readyState == 4) {
if
(xmlReq.status == 200) {
var
jsonData = eval('('
+ xmlReq.responseText + ')'
);
alert(jsonData.message);
}
else
if
(xmlReq.status == 404) {
alert("Requested URL is not found."
);
} else
if
(xmlReq.status == 403) {
alert("Access denied."
);
} else
{
alert("status is "
+ xmlReq.status);
}
}
};
xmlReq.send(null
);
}
testAsynRequest();//1
while
(true
) {
}
サービス側で簡単な出力を実現:TP-LINK WR 340 G設定チュートリアル
private
void
ProcessAjaxRequest(HttpContext context)
{
string
action = context.Request["ajax"
];
Thread.Sleep(1000);// 1
string
jsonObject = "{\"message\":\""
+ action + "\"}"
;
context.Response.Write(jsonObject);
}
理論上、ajax非同期要求が、その非同期コールバック関数が単一のスレッドにある場合、コールバック関数は必然的に他のスレッド「妨害」されずに順調に実行され、すなわち1秒後、コールバック実行は「ajax」をポップアップするが、実際の状況はそうではなく、ブラウザが再びデッドサイクルのために偽死したため、コールバック関数は実行できない.
結論:実践結果からjavascriptエンジンは確かに単一スレッドでそのタスクキューを処理している(成果は一般関数とコールバック関数からなるキューであることが理解できるか?)のです.Javascriptで非同期プログラミングを実現するのは大きな障壁法であり、単一スレッドのエンジンでマルチスレッドのプログラミングを実現し、リソースの同期反発などの操作(C#、Javaなどの言語のマルチスレッドなど)を実現するには、本当に実現するのは簡単に保証できないと感じています.
補足:javascriptのsleepをどのように実現しますか?stackoverflowでjavascript sleepを見つけて、試してみましたが、効果はありましたが、実行するときはcpuが高いので、直接settimeoutしたほうがいいですね.