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

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

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

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

jQuery

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

Q&A

解決済

1回答

914閲覧

ajaxで取得した値がreturnされません

Ummo

総合スコア30

JavaScript

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

jQuery

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

0グッド

0クリップ

投稿2021/05/19 12:46

ajaxで値を取得したのですが、returnしても値がとれません。

javascript

1$(function(){ 2 let lists = getLists(id); 3 console.log(lists); 4}); 5 6function getLists(id) { 7 $.ajax({ 8 type: 'POST', 9 url: '/test/test.json', 10 data: { 11 'id': id, 12 'token_key': token() 13 }, 14 cache: false, 15 dataType: 'json', 16 }).done(function(res) { 17 let resLists = res.lists; 18 console.log(resLists); 19 createTable(resLists) 20 return lists; 21 }).fail(function(res) { 22 alert("失敗しました"); 23 return []; 24 }); 25} 26 27function createTable(lists) { 28 let table = $('#table tbody').children(); 29 if (table.length !== 0) 30 { 31 $('#table tbody').empty(); 32 } 33 lists.forEach(function(val,key) { 34 source = ` 35 <tr> 36 <td>${val.name}</td> 37 <td>${val.address}</td> 38 <td>${val.email}</td> 39 </tr> 40 `; 41 $('#table tbody').append(source); 42 }); 43} 44 45function token() { 46//トークンを生成 47}

console.log(lists)では、returnしている値を取得できませんでした。
でも、doneのところで実行しているconsole.log(resLists);は
値が取得できていることを確認しています。
また、その後実行しているcreateTable()でも値がとれていて
その後の処理も実行できました。

なぜreturnしているのに、console.log(lists)のところで値がとれないのでしょうか?
もしよければアドバイスよろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

jQueryメソッド、$.ajaxが、そのチェーンメソッド内でreturnさせた値を返すメソッドではないからです。
また、例え、返したとしても、
getLists(id)自体もreturnを実行せねばなりませんが、
そういった構文になっていないからです。

よって、lists変数を、扱えるスコープ上で、定義した上で、
getLists(id)を実行し、そのチェーンメソッド内で、lists変数に中身を入れるような構文を組まねばなりません。

投稿2021/05/19 12:54

miyabi_takatsuk

総合スコア9555

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

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

miyabi_takatsuk

2021/05/19 12:57

また、非同期処理なので、jQueryのajaxメソッドだと、扱いに工夫が必要になるので、 ネイティブのfetchメソッドなど、非同期処理をやりやすいメソッドを使った方がいいでしょう。
Ummo

2021/05/19 13:28 編集

回答ありがとうございます!!! 「$.ajaxが、そのチェーンメソッド内でreturnさせた値を返すメソッドではない」という事を知らず、勉強不足でした。 return $.ajax 〜 で丸ごと返し、lists変数のスコープ上で、以下を行ったら取得できました。 $(function(){ getLists(id)then(function(data) { list = data.lists; }); }); 「ネイティブのfetchメソッドなど、非同期処理をやりやすいメソッドを使った方がいい」という部分についてもありがとうございます。こちらも調べてみます! まったく分からず困っていたので、とても助かりました。本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問