jQueryで、ページを構成する要素を並列で取得しようと考えています。
「/samples/heavy_function_parts1」
「/samples/heavy_function_parts2」
「/samples/heavy_function_parts3」
「/samples/heavy_function_parts4」
「/samples/heavy_function_parts5」
はそれぞれ、sleepして5秒後に現在時刻を返す処理となります。
下記のようなコードを書くと、div「Info5」が更新されるのが、ページ表示後
25秒後となります。
5秒後にすべての情報の更新が完了することを期待しているのですが、
どのように修正すべきでしょうか?
※FirefoxのLive HTTP headersを使ってログを取得してみると、リクエストは
同時に一つしか行われていない(リクエストが完了してから次のリクエストが
行われている)ようです。もしかしてWebブラウザの仕様だったりしますでしょうか?
<script type="text/javascript">
$(function(){
$("#Info1").load("/samples/heavy_function_parts1");
$("#Info2").load("/samples/heavy_function_parts2");
$("#Info3").load("/samples/heavy_function_parts3");
$("#Info4").load("/samples/heavy_function_parts4");
$("#Info5").load("/samples/heavy_function_parts5");
});
</script>
<div id="Info1">情報1</div>
<div id="Info2">情報2</div>
<div id="Info3">情報3</div>
<div id="Info4">情報4</div>
<div id="Info5">情報5</div>
No.3ベストアンサー
- 回答日時:
>loadを並列で実行したとしてもそれはキューにたまるだけであり、通信自体はシリアルで行われているのかなという気もしてきました。
$.load()ではなく、No.1で書かれているように$.ajax()を直接呼び出してみるとどうでしょうか。
(引数の指定の仕方などが変わるようです)
手元にあるver.1.42のコードを読んでみると、戻り値がXHRオブジェクトのようですので、場合によってはXHRオブジェクトを直接操作して、動作確認できるかもしれません。
(別途タイマーを用意して、XHRオブジェクトのreadystateが2や3(通信中)になってるかどうかなど)
なお、複数のリクエストを同時に行うこと自体は可能です。
私は自作ライブラリを使用していますが、4~8個(この個数はブラウザの設定による)まで、同時リクエストが可能です。
私からの情報はこの辺りまでですね。
$.ajax()で作成したXHRオブジェクトを直接.open()や.send()するなどの方法もあるでしょうけど、
そこまで行くとライブラリを使うメリットが無くなるかもです。
No.2
- 回答日時:
以下のいずれかでどうでしょうか?
括弧の対応が間違ってたらすみません、適宜調整してください。
(1)--------------------
<div id="Info1">情報1</div>
<div id="Info2">情報2</div>
<div id="Info3">情報3</div>
<div id="Info4">情報4</div>
<div id="Info5">情報5</div>
<script type="text/javascript">
//window.onloadを待たず、直接呼び出す
$("#Info1").load("/samples/heavy_function_parts1");
$("#Info2").load("/samples/heavy_function_parts2");
$("#Info3").load("/samples/heavy_function_parts3");
$("#Info4").load("/samples/heavy_function_parts4");
$("#Info5").load("/samples/heavy_function_parts5");
</script>
(2)--------------------
<script type="text/javascript">
//$();を5回呼び出す
$(function(){$("#Info1").load("/samples/heavy_function_parts1");});
$(function(){$("#Info2").load("/samples/heavy_function_parts2");});
$(function(){$("#Info3").load("/samples/heavy_function_parts3");});
$(function(){$("#Info4").load("/samples/heavy_function_parts4");});
$(function(){$("#Info5").load("/samples/heavy_function_parts5");});
</script>
<div id="Info1">情報1</div>(以下略)
(3)--------------------
<script type="text/javascript">
//$()ではなく$(document).ready()を使用する
$(document).ready(function(){
$("#Info1").load("/samples/heavy_function_parts1");
$("#Info2").load("/samples/heavy_function_parts2");
$("#Info3").load("/samples/heavy_function_parts3");
$("#Info4").load("/samples/heavy_function_parts4");
$("#Info5").load("/samples/heavy_function_parts5");
});
</script>
<div id="Info1">情報1</div>(以下略)
(4)--------------------
<script type="text/javascript">
//$(document).ready()を5回呼び出す
$(document).ready(function(){$("#Info1").load("/samples/heavy_function_parts1");});
$(document).ready(function(){$("#Info1").load("/samples/heavy_function_parts1");});
(字数制限により以下略)
>No.1
何秒後に更新するのではなく、「5つのリクエストを同時に行う」のが目的だと思います。
1~4のそれぞれについて試してみました。
結果はどれも同じで、前のリクエストの結果を受信してから次のリクエストが行われるという形で、時間はどれも25秒かかることとなりました。
ちょっと調べてみるとjavascript自体はシングルスレッドとのことで、loadを並列で実行したとしてもそれはキューにたまるだけであり、通信自体はシリアルで行われているのかなという気もしてきました。
No.1
- 回答日時:
jQueryの$.load()は、同じくjQueryの$.ajax()のラッパーのはずです。
$.ajax()では、デフォルトでasync:true (非同期)です。つまりそれぞれの通信を待たずにレスポンスを受信しだい、それぞれのコールバック関数が非同期に実行されます。
クライアント側とサーバー側のオーバーヘッド時間及び通信回線のスループットによって処理完了までの時間は毎回異なります。
従いまして、ご質問のような、「5秒後にすべての情報の更新が完了することを期待」を実装は不可能ではないでしょうか...
オーバーヘッド等があるのは承知しています。
5秒を多少超えてもかまいません。
少なくとも上記コードでは非同期処理にも関わらず、通信部分においては前の通信が完了するまで待機しているように思えます。
回避する手段があればお教えいただければと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/07 21:04
- JavaScript javascriptで移動ボタンを押した際に遷移するボタンを追記したい 1 2022/11/29 03:02
- JavaScript 画像の表示位置 3 2022/12/23 08:25
- JavaScript jqueryを使ったスムーススクロールのコードを書いたのですが、HTMLコード内にある、a butt 2 2022/04/14 10:59
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/30 09:10
- JavaScript 【Javascript】ボタンクリックで2つのclassに対し、それぞれ別のclassを追加したい 1 2022/07/29 20:52
- JavaScript プログラムがうまく動きませんレビューお願いします 1 2022/07/10 05:08
- JavaScript ソースコードのいじる場所が分かりません。 1 2022/12/23 02:06
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
- JavaScript ①入力フォーム→②確認表示画面→③送信完了画面のコードを書いているのです、 入力フォームから受け取っ 2 2022/05/10 16:45
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バッチファイル 特定ウインドウ...
-
PDFを(htmlのように)無限に縦...
-
Googleマップに複数のピンを立...
-
IE操作アプリでの終了理時のエ...
-
データ受け渡しについて
-
1w=1j.s
-
VBA ディレクトリ名をワイルド...
-
正規表現で、特定の文字列を含...
-
VBAでクイズゲームの作り方
-
以下のURL入れますか?皆さんは↓
-
画像のドットの部分が抜けてい...
-
Chinapost こよパズルどう動か...
-
非同期通信で掲示板を作る際の...
-
非同期通信を使うタイミングが...
-
PYTHONのtkinterについて
-
Pythonのtkinterについて
-
Pythonを勉強する道のり
-
Pythonを無料(安価)で学ぶ方...
-
RPA(PowerAutomate)の実装について
-
ワードでA3横の画面にして、文...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
jQueryで、複数条件の絞り込み機能
-
要素内を常に一番下を表示させたい
-
jqueryのgetでJSPを呼び出したい
-
JQueryでAjax通信をキャンセル...
-
jqueryについて
-
jqueryを使って非同期通信で10...
-
コールバック中の変数操作
-
JavaScriptでtabindexの変更っ...
-
階層別の組織図の自動作成について
-
readyStateが4にならない原因
-
Javascriptを使ってQRコード読...
-
jQueryのアコーディオン一番目...
-
カンマ区切りのデータを配列に...
-
インラインフレームを自動更新...
-
SQLのmaxで求めた値を変数に代...
-
JavascriptからPHPへのAjax通信...
-
jQueryのblockUIをformのボタン...
-
二つのbxsliderをレスポンシブ...
-
変数にドットをいれることはか...
-
一定時間ごとに表示内容を切り...
おすすめ情報