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

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

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

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

Ajax

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

Q&A

解決済

3回答

416閲覧

Ajaxの処理を入力順で実行したい

shaketonori

総合スコア22

JavaScript

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

Ajax

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

0グッド

0クリップ

投稿2023/11/03 08:47

実現したいこと

Ajaxの処理を思い通りの順番で実行したい。

前提

生徒の成績を登録するプログラムを書いています。
4行から20行程度の表で、参加生徒の生徒コードと生徒名が表示されています。
そのFormに各生徒の点数を入力し、一括入力しようとしています。

下にあるコードで一括処理をしようとすると、登録はできるのですが、順番が
バラバラに登録されてしまいます。再表示するときに入力した順番で表示したい
と考えていますがうまくいきません。
Ajaxは「非同期処理」であることはわかっているのですが、これを同期的な処理
にする方法がわかりません。

該当のソースコード

``
function doRecordAdd(gyoCount){

for (let i = 0; i < gyoCount; i++){ if($('#record' + i).val() != ""){ $.ajax({ type: "POST", url: "../code/record/RecordAdd.php", data: {"testId":$('#testId').val(), "seitoId":$('#seitoId' + i).val(), "record":$('#record' + i).val()}, dataType: 'text', }).done(function(response) { if(response != 0){ alert('追加登録されました。'); }else{ alert('追加登録できませんでした。'); } }).fail(function(response_j) { alert('参加申込できませんでした。管理者にご連絡下さい。T'); // 通信失敗時の処理 }); }else{ alert("データが有りません"); } }

}

``

試したこと

「promis/differd」や「async/await」などの方法でajaxを同期処理できることは
わかっていて、特に今回の場合は「async/await」がいいんじゃないかと考え、いろいろ
いじってみましたがうまくいきませんでした。
いろいろな資料を読んでも理解できず、当てずっぽうに async と await を組み込んで
みましたが当然のことながらうまくいきませんでした。

よろしくご指導ください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

Lhankor_Mhy

2023/11/04 00:36

『再表示』とはご提示のコードでいうとどの部分に当たりますか? alert('追加登録されました。') ですか?
guest

回答3

0

処理的にはこうですが

javascript

1$(async function(){ 2 for(・・・){ 3 await new Promise(function(resolve){ 4 $.ajax({ 5 ・・・ 6 }).done(function(data){ 7 resolve(); 8 }); 9 }); 10 } 11});

そもそもデータを同期的に冗長に送りつけるのは無駄です。
サーバー側で複数のデータを対処できるようなAPIを用意するか
表示を「送信順」という曖昧なものではなくユーザーID順など明示的なルールを決めることです

投稿2023/11/04 02:58

yambejp

総合スコア117674

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

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

shaketonori

2023/11/04 06:07

回答ありがとうございました。 「眼からウロコ」でした。確かに、漫然と「送信順」でなく、「ID順」や「点数の降順」といった明示的なルールを設けるべきですね。成績データとしてはデタラメ(?)な順で登録されても、表示するときに必要なソートをすればいいわけですから。 今回は他の方に「ベストアンサー」を差し上げましたが、yambejpさんの提示して頂いたコードを見て、更に勉強したいと思います。 ありがとうございました。
guest

0

ベストアンサー

こういうことでしょうか?

js

1async function doRecordAdd(gyoCount) { 2 3 for (let i = 0; i < gyoCount; i++) { 4 if ($('#record' + i).val() != "") { 5 6 await $.ajax({ 7 type: "POST", 8 url: "http://example.com/code/record/RecordAdd.php", 9 data: { "testId": $('#testId').val(), "seitoId": $('#seitoId' + i).val(), "record": $('#record' + i).val() }, 10 dataType: 'text', 11 12 }).done(function (response) { 13 14 if (response != 0) { 15 alert('追加登録されました。'); 16 17 } else { 18 alert('追加登録できませんでした。'); 19 20 } 21 22 }).fail(function (response_j) { 23 alert('参加申込できませんでした。管理者にご連絡下さい。T'); 24 // 通信失敗時の処理 25 }).catch(function () { }); 26 27 } else { 28 alert("データが有りません"); 29 } 30 } 31}

投稿2023/11/04 01:18

Lhankor_Mhy

総合スコア37421

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

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

shaketonori

2023/11/04 06:07

回答ありがとうございました。 私の希望通りの動きをしてくれました。シンプルに「async」を付けた関数の中で 「await」をajaxに着ければいいんですね。いたって簡単でびっくりしました。 ありがとうございました。
Lhankor_Mhy

2023/11/04 06:35

お役に立てたようで何よりです。 なお、.catch() も付けていますので、お気をつけて。
guest

0

$.ajax() メソッドの引数に async: false を追加してはどうでしょう。

あるいは fetch を使って以下のように記述します。

javascript

1(async function() { 2 'use strict'; 3 4 const Util = { 5 formData(obj) { 6 const formData = new FormData(); 7 Object.keys(obj).forEach(key => { 8 formData.append(key, obj[key]); 9 }); 10 return formData; 11 }, 12 fetchPost(url, obj) { 13 return fetch(url, {method: 'POST', body: Util.formData(obj)}); 14 }, 15 }; 16 17 for (let i = 0; i < 10; ++i) { 18 const url = '../code/record/RecordAdd.php'; 19 const data = {id: i + 1}; 20 const response = await Util.fetchPost(url, data); 21 22 if (!response.ok) { 23 alert('参加申込できませんでした。管理者にご連絡下さい。'); 24 break; 25 } 26 27 // 必要なら 28 const result = await response.text(); 29 if (result != 0) { 30 // ... 31 } 32 } 33}());

投稿2023/11/03 09:50

arcxor

総合スコア2857

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

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

yambejp

2023/11/03 13:32

$.ajaxのasync指定は非推奨なのでNGです
arcxor

2023/11/03 14:51 編集

https://api.jquery.com/jQuery.ajax/ > As of jQuery 1.8, the use of async: false with jqXHR ($.Deferred) is deprecated; you must use the success/error/complete callback options instead of the corresponding methods of the jqXHR object such as jqXHR.done(). 確かに、async: false をつけただけでは元のコードは期待通り動かないようですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問