連続した ajax を順番通り実行するために、これまで「async:false」で同期させていましたが、
「async:false」は非推奨になったということで警告が出てくるため、書き直しているところです。
いろいろ調べてみると、promiseオブジェクトのステータスを監視することによって、同期的処理ができる
ということで以下のコードを書きました。
1番目の ajax では分類検索を行い、categoryText に結果("bird" 又は "fish")を表示します。
その表示された結果に基づいて2番目の ajax が起動し、該当する「名前」を2つ目の nameText
に表示("swallow" 又は "carp")するとというものです。
コンソールの結果を見てみると、2つの ajax の順序が逆になるというより、1つの ajax 内で
も前後しているようです。
ステータス1-1
ステータス1-2
ステータス2-1
ステータス2-2
の順番で処理してもらいたいのですが・・・
Deferred や then の扱い方が正しく理解できていないようです。
どなたかご指導くださるよう、お願い致します。
<!DOCTYPE HTML> <html lang ="ja"> <head> <meta charset ="utf-8"> <title>テスト</title> <script type="text/javascript" src="../js/jquery-1.11.2.min.js"></script> <script type="text/javascript"> function func1(){ var number = $('#numberText').val(); var dfd1 = $.Deferred(); $.ajax({ type: "POST", url: "../code/backyard/SearchCategory.php", data: {"number":number}, dataType: 'text', }).done(function(response) { $('#categoryText').get(0).value = response; dfd1.resolve(); }).fail(function(response) { alert('error!!!'); }).always(function() { console.log("func1 complete"); console.log('ステータス1-1================' + dfd1.state()); }); console.log('ステータス1-2================' + dfd1.state()); return dfd1.promise(); } function func2(){ var category = $('#categoryText').val(); console.log("category=========" + category); var dfd2 = $.Deferred(); $.ajax({ type: "POST", url: "../code/backyard/SearchObject.php", data: {"category":category}, dataType: 'text', }).done(function(response) { $('#nameText').get(0).value = response; dfd2.resolve(); }).fail(function(response) { alert('error!!!'); }).always(function() { console.log("func2 complete"); console.log('ステータス2-1================' + dfd2.state()); }); console.log('ステータス2-2================' + dfd2.state()); return dfd2.promise(); } function goSearch(){ func1() .then(func2()); } </script> </head> <body> 番号<input type="text" id="numberText" /> <input type="button" value="送信" onclick="goSearch()" /> <br /> 種類<input type="text" id="categoryText" /><br /> 名前<input type="text" id="nameText" /> </div> </body>
【コンソールの表示内容】
ステータス1-2================pending
category=========
ステータス2-2================pending
func2 complete
ステータス2-1================resolved
func1 complete
ステータス1-1================resolved

回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/05/28 22:06