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

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

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

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

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Q&A

解決済

3回答

1755閲覧

jsでasyncの使い方について

hanzoumon

総合スコア13

JavaScript

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

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

0グッド

1クリップ

投稿2018/08/21 14:28

編集2018/08/21 14:30

お世話になっております。
あるWEBの仕組みで、起動時にDBから担当者名を取得し、セレクトボックスに表示させています。
localStrageに、前回選択していた担当者名が存在するなら、その値を取得し、セレクトボックスの内容を選択状態にしようと考えています。
最初、何も考えずに①DBから取得→②セレクトボックスへ流し込み→③localStrageに入っているValue値から、対応するセレクトボックスを選択状態に。としていましたが、DBから取得最中に③が走り、期待する動作をしません。
調べている中で、非同期処理にて対応すれば良いことがわかり、async関数を使うことにしました(promiseがいまいち理解出来ていないからなのですが…)。

下のコードを実行すると、コンソールには、1 → Setemper2 → 2 → Setemper1 の順で表示されます。
awaitのあるところで、処理が返るまで待機してくれるものかと思っていたのですが、その様ではなく。

何かいろいろ、考え違い(理解出来ていない)があると思うのですが、1 → Setemper1 → Setemper2 → 2
の順で処理させるにはどの様にすればよいのでしょうか。ご教示お願い致します。

js

1async function hoge() { 2 console.log('1'); 3 await SetEmper(getDept); //担当者セット 4 console.log('2'); 5} 6 7hoge('01211'); 8 9function SetEmper(deptCode) { 10 tempDeptCode = deptCode; 11 $.ajax({ 12 url: 'php/getStdInfo.php', 13 dataType: 'Json', 14 type: 'GET', 15 data: {type: 'deptemp', 16 deptcode: tempDeptCode}, 17 success: function (data) { 18 //現在のリストを削除 19 $('#ddlEmp').children().remove(); 20 $.each(data, function () { 21 $('#ddlEmp').append($('<option>').attr({value: this.EMP_CODE}).text(this.EMP_NAME)); 22 }); 23 console.log('Setemper1'); 24 }, 25 error: function (XMLHttpRequest, textStatus, errorThrown) { 26 console.log(textStatus); 27 return; 28 } 29 30 }); 31 console.log('setemper2'); 32} 33

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

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

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

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

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

guest

回答3

0

jQuery の Deferred/Promise オブジェクトはネイティブの Promise オブジェクトではないため、awaitで待つことはできません。
jQueryの仕様に従い、$.ajax()の戻りをreturnで返してそれのdoneメソッド等を呼ぶか、そうでなければ ajax ではなく、Fetch API に置き換えたらどうでしょうか?
https://developer.mozilla.org/ja/docs/Web/API/Fetch_API

投稿2018/08/22 09:39

x_x

総合スコア13749

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

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

hanzoumon

2018/08/22 14:31

ご回答有難う御座います。URL拝見させて頂きました。サンデー片手間PGの私には、かなり高度な内容に感じました。fetchAPI、ちょっと勉強させて頂きます。有難う御座いました。
guest

0

$.ajax() が返す promise の中に実は取得したデータが入ってるので、これを使うと簡潔に書けます。エラーは try-cache で補足します。

async function hoge() { console.log('1'); await SetEmper(getDept); console.log('2'); } async function SetEmper(deptCode) { tempDeptCode = deptCode; try { const data = await $.ajax({ url: './data.php', dataType: 'json', data: {type: 'deptemp', deptcode: tempDeptCode} }); $('#ddlEmp').children().remove(); $.each(data, function () { $('#ddlEmp').append($('<option>').attr({value: this.EMP_CODE}).text(this.EMP_NAME)); }); console.log('SetEmpr1'); } catch (err) { console.log(err.statuxText); } console.log('SetEmpr2'); }

あとこれは本題から外れちゃうのですが、念のため書いておきます。

  • getDept はもしかして getDept() では無いでしょうか。
  • tempDeptCode = deptCode でグローバル変数を汚染しちゃってます。

投稿2018/08/21 16:15

set0gut1

総合スコア2413

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

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

hanzoumon

2018/08/22 14:21

ご回答、有難う御座います!基本的な動作、勉強になりました。 すみません、ソースがおかしかったですね。hogeの引数になんの意味もありませんでした。 ご指摘のとおり、ここは部門コードをとってくる関数が入ります。 あと、変数の汚染。ご指摘の通りです。こういったところに横着してしまいますね… 正に素人です。 時間の差で、最初の回答者の方をベストアンサーにしましたが、set0gut1様の書かれたコードが、基本となる様に思います。今後のテンプレとさせて頂きます。有難う御座いました!
set0gut1

2018/08/22 14:24

コメントありがとうございます!またいつでもどうぞ。
guest

0

ベストアンサー

非同期部分は$.ajaxなので、そこをawaitしてやればいいのかと思います。

SetEmperのほうを以下のように書き換えることで期待した動作になりますか?
※jQueryのバージョンでうまく動かなかったらすいません

js

1async function SetEmper(deptCode) { 2 tempDeptCode = deptCode; 3 await $.ajax({ 4 url: 'php/getStdInfo.php', 5 dataType: 'Json', 6 type: 'GET', 7 data: {type: 'deptemp', 8 deptcode: tempDeptCode}, 9 success: function (data) { 10 //現在のリストを削除 11 $('#ddlEmp').children().remove(); 12 $.each(data, function () { 13 $('#ddlEmp').append($('<option>').attr({value: this.EMP_CODE}).text(this.EMP_NAME)); 14 }); 15 console.log('Setemper1'); 16 }, 17 error: function (XMLHttpRequest, textStatus, errorThrown) { 18 console.log(textStatus); 19 return; 20 } 21 22 }); 23 console.log('setemper2'); 24}

投稿2018/08/21 14:48

denzow

総合スコア640

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

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

hanzoumon

2018/08/22 14:23

ご回答、有難う御座います。ご教示頂いた内容で思った通りに動きました!大変助かりました。 なるほど、そちらにawaitをつけるのですね。やはり、勉強不足でした。 早速のご回答、有難う御座いました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問