ボタンをクリックすると、Expressサーバーとの(非同期的に)Ajax呼び出しが行われます。ExpressサーバーへのAjax呼び出しによりUIがフリーズされる
エクスプレスルートハンドラでは、ループを実行することで長時間実行される操作をシミュレートします(これはデモです。将来はJava REST APIへのリモートリクエストをここで行う予定です)。
結果として、ここでUIがフリーズします(その間に読み込み中の画像は表示されません)。ここで問題を見つけるのを助けてくれますか? 以下のコード(私はPOSTの両方で試してみましたとメソッド、まだ同じ問題をGETしている)である:
クライアント
$('#searchBtn').click(function() {
$.ajax({
type: 'GET',
url: 'searchRepo',
async: true,
beforeSend: function() {
$('#testDiv').html('');
$('#loadingIc').show();
},
complete: function() {
$('#loadingIc').hide();
},
success: function (result) {
$('#testDiv').html('<div>Test</div>');
}
});
});
サーバー
router.get('/searchRepo', function (req, res) {
sleep(10000);
res.send('aaaaa');
});
function sleep(milliseconds) {
var start = new Date().getTime();
for (var i = 0; i < 1e7; i++) {
if ((new Date().getTime() - start) > milliseconds){
break;
}
}
サーバ上の 'sleep()'シミュレーションがサーバを強制終了しています。 node.jsはシングルスレッドなので、タイトなループはそのループが完了するまであなたのサーバが何もしないことを意味します。これは実際の遠隔要求の貧弱なシミュレーションです。代わりに 'setTimeout()'を使用してください。あなたのサーバが他のファイル(CSSファイル、スクリプトファイルなど)を提供するのを待っていない限り、ブラウザをフリーズさせるものは何もありません。 – jfriend00
しかし、クライアント側で何も起こらないのはなぜか分かりません。少なくとも積載画像が表示され、物事が正しく冷凍されるべきではありませんか?そしてあなたはルータコードでsetTimeoutを意味しますか? – ramcrys