質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

4回答

2572閲覧

ajaxで順番に表示できない

AKR

総合スコア12

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

1クリップ

投稿2016/05/25 03:24

編集2016/05/25 03:36

###前提・実現したいこと
現在phpとJavaScript(jQuery)を使用してTwitterクライアントサービスを開発しています。
ループを使用した時のajaxで、データ送信順に表示したい。

###発生している問題・エラーメッセージ
ajaxのデータ送信順に表示しようとしているが上手くいっていない。
※最初は同期通信をしていたのですが、待ち時間が長いことからajaxを使用することにしました。
結果、待ち時間の問題を解決することができたのですが現在の問題が発生した状態です。
そもそもajaxはデータの処理が終わったものからデータを受信しているので、受け取り順に関しては厳しいのでしょうか?
また、単純に順番に表示出来るか出来ないかだけでも教えていただけば幸いです。

理想の表示順
data[0], data[1], data[2], ...

現在の表示順(例)
data[2], data[0], data[1], ...

for(id = 0; id < id_count; id++){ var val = alltweet[id]; var data = { tweet : val, user : user_id, id : id }; $.when( $.ajax({ type: "post", url: "update.php", data: data, datatype: 'json' }) ).done(function(data){ //ここで受け取ったデータを表示する AppendData(data); }); }

###試したこと
ソースコードのように.when()と.done()を使用してみましたが出来ませんでした。

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報
php : 5.6.18
jQuery : 1.11.3

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

同期通信と非同期通信を足して2で割ったような答えになりましたが、データを送信した順番通りに出力することができました。
※待ち時間が増える場合がある。

JavaScript

1var user_id = <?php echo json_encode($user_id); ?>; 2var alltweet = <?php echo json_encode($req); ?>; 3var id_count = alltweet.length; 4var show_id = 0; 5var data_list = []; 6 7for(id = 0; id < id_count; id++){ 8 var val = alltweet[id]; 9 var data = { tweet : val , user : user_id , id : id }; 10 11 $.ajax({ 12 type: "post", 13 url: "update.php", 14 data: data, 15 datatype: "json" 16 }).done(function(data){ 17 data_list[data["id"]] = data; 18 if(show_id == data["id"]){ 19 while(data_list[show_id] != null){ 20 AppendData(data_list[show_id]); 21 show_id++; 22 } 23 } 24 }); 25 26}

投稿2016/05/25 07:14

AKR

総合スコア12

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

jq

1var test = { 2 //ajaxの処理 3 ajax: function(data){ 4 var def = $.Deferred(); 5 $.ajax({ 6 type: "post", 7 url: "update.php", 8 data: data, 9 datatype: 'json', 10 success: def.resolve, 11 error: def.reject 12 }); 13 return def.promise(); 14 } 15}; 16 17//データを整形したりその他諸々 18function get_data1() { 19 //何かしらの処理 20 return test.ajax(data); 21} 22function get_data2() { 23 //何かしらの処理 24 return test.ajax(data); 25} 26 27$.when( 28 //各get_dataを並列で実行 29 get_data1(), 30 get_data2() 31).done(function(aa,bb){ 32 //aa,bbにはそれぞれget_data()で処理してajaxしたデータが入る 33 //$(セレクタ).html(aa)などの処理 34}).fail(function(aax,bbx){ 35 //エラーの時の処理 36}); 37

同じような実行環境がないので、想像で書きましたがこんな感じでどうでしょうか?
結局ajaxして得られたデータが順番に$.whenの.done(function(){...})に入るので順番は保たれるように思うんですが。
手動でするのをちょっと便利にしたぐらいの話ですけれども(笑)

get_data()は分けて書きましたが、ここでそれぞれのデータをtest.ajax()に送れば.promise()で返ってくると思うんですよ。でそれを$whenのdoneで次々にappendすれば・・・。

僕はこれをGoogle+やはてブなどのSNSのシェアボタンのカウンタ処理に使ってます。get_data()の部分が各SNSのAPIアドレスやその事前処理、$.whenのdone内が返ってきたデータの事後処理としてます。

投稿2016/06/06 18:30

hidekichi

総合スコア366

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

御覧になられているかもしれませんが、下記記事をベースに改造したら順序が保障されたAjax通信が出来そうです。

【結果の順番を保証して、且つ『並列』でAjax通信を行う方法 - Qiita】
http://qiita.com/YusukeHirao/items/bca14c5f2fe4026fd4d7

投稿2016/05/25 17:29

kei344

総合スコア69398

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

$.whenは使ったことがないのですが、$.whenの中にループがないと、処理が全て終わった場合に次の処理をする、ということができないと思います。
ですので、以下のようになるのではないでしょうか。
※使ったことがないので参考程度にお願いします。

javascript

1var data_list = {}; 2$.when( 3 for(id = 0; id < id_count; id++){ 4 var val = alltweet[id]; 5 var data = { tweet : val, user : user_id, id : id }; 6 $.ajax({ 7 type: "post", 8 url: "update.php", 9 data: data, 10 datatype: 'json', 11 success: function(data){ 12 data_list[data['id']] = data; 13 } 14 }); 15 } 16).done(function(){ 17 //ここで受け取ったデータを表示する 18 AppendData(data_list); 19});

AppendDataにはdata中のidをキーとして連想配列で入る想定ですので、AppendDataではid順にデータを表示するようにすれば良いのではないでしょうか。

投稿2016/05/25 04:05

munyagu

総合スコア479

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

AKR

2016/05/25 07:19

受信データを配列に格納する考え方を取り入れて何とか実装することができました。 あと、$.when()の中にforを使うと上手くできなかったです。(自分の知識・技術不足かもしれません)
munyagu

2016/05/25 08:29

$.when()を使ったことがないので、そのような制約があるのかもしれませんね。 失礼しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問