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

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

新規登録して質問してみよう
ただいま回答率
85.48%
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

解決済

6回答

7283閲覧

関数内でajax

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

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

jQuery

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

Ajax

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

0グッド

0クリップ

投稿2014/12/07 16:05

関数内でAjax通信を行いその結果を返したいです。
当然ながら下記コードではうまくいきません。
どうしたらよいでしょうか。

lang

1$(function() { 2 console.log(get_hoge()); 3 function get_hoge() { 4 $.ajax({ 5 url: 'hoge.php', 6 type:'POST', 7 dataType: 'json', 8 cache : false, 9 data : {piyo : '1'} 10 }).done(function(data) { 11 return data.hoge; 12 }).fail(function() { 13 console.log("error"); 14 }); 15 } 16}); 17コード

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

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

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

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

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

guest

回答6

0

同期的にやるなら次のような感じでは無いでしょうか?

lang

1$(function() { 2 console.log(get_hoge()); 3 function get_hoge() { 4 var result; 5 $.ajax({ 6 url: 'hoge.php', 7 async: false, 8 type:'POST', 9 dataType: 'json', 10 cache : false, 11 data : {piyo : '1'} 12 }).done(function(data) { 13 result = data.hoge; 14 }).fail(function() { 15 console.log("error"); 16 }); 17 return result; 18 } 19});

非同期のままにするなら $.ajax の戻り値をそのまま返して呼び出し元で then とか done とかをするか、

lang

1$(function() { 2 get_hoge().then(function(data){ 3 console.log(data.hoge); 4 }); 5 function get_hoge() { 6 return $.ajax({ 7 url: 'hoge.php', 8 type:'POST', 9 dataType: 'json', 10 cache : false, 11 data : {piyo : '1'} 12 }); 13 } 14});

コールバックを渡してやることになると思います。

lang

1$(function() { 2 get_hoge(function(hoge){ 3 console.log(hoge); 4 }); 5 6 function get_hoge(callback) { 7 $.ajax({ 8 url: 'hoge.php', 9 type:'POST', 10 dataType: 'json', 11 cache : false, 12 data : {piyo : '1'} 13 }).done(function(data) { 14 callback(data.hoge); 15 }).fail(function() { 16 console.log("error"); 17 }); 18 } 19});

投稿2014/12/08 00:50

ngyuki

総合スコア4514

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

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

0

失礼しました。objectが返ってきてしまうということで、グローバル変数を使ったサンプルをかいてみました 。

lang

1function get_hoge() { 2 result = null; 3 4 $.ajax({ 5 ... 6 }).done(function(data) { 7 result = data.hoge; 8 }).fail(function() { 9 ... 10 }); 11 12 return result; 13}

投稿2014/12/07 23:13

SAMURAI-HACK

総合スコア988

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

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

0

参考情報を紹介します。 (google で "ajax jquery return" を検索した結果からの抜粋)

...
これはajax()がデフォルトでは非同期通信をするためである。非同期通信とは、レスポンスが返って来る前に次の処理に行くことである。だから返り値を返す前に次の処理に行っちゃう。
...
解決策

  1. 同期通信にしちゃう

...
2. .done(), .fail()をつかう
...

投稿2014/12/07 17:39

katoy

総合スコア22324

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

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

0

lang

1function get_hoge(){ 2 3 var result = $.ajax(...); 4 return result; 5 6}

このようにしてみてはいかがでしょうか。
return data.hoge;の値をresultに入れて、それを返すという感じです。

投稿2014/12/07 16:27

SAMURAI-HACK

総合スコア988

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

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

退会済みユーザー

退会済みユーザー

2014/12/07 16:51

ご回答いただきありがとうございます。 試してみたのですが、data.hogeの値がresultに入らず、 Objectが返ってきてしまいます。
guest

0

なぜ非同期通信だとグローバル変数に格納できないのでしょうか。

格納はされると思いますが、
非同期処理なので値が入ってくる前に次の処理に行ってしまいます。

  1. 変数を宣言する(グローバルなら宣言しないですが…)
  2. 非同期処理を始める
  3. 非同期処理が終わる前に戻り値を返してしまう
  4. 非同期処理が終わって値が入る

setIntervalを使って値の監視とかすれば、
処理が返ってきてから先に進めることもできるとは思いますが、
素直にコールバックを使った方が素敵だと思います。

投稿2014/12/08 12:52

nyago_d

総合スコア178

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

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

0

ベストアンサー

なぜ非同期通信だとグローバル変数に格納できないのでしょうか。

処理の順番を書いてみました。

非同期の場合 (6) が実行されるのは console.log() の後になります(より正確には $(function(){ ... } を抜けた後)。

lang

1console.log( // (5) 2 get_hoge() // (1) 3); 4 5function get_hoge() { 6 7 result = null; // (2) 8 9 $.ajax({ // (3) 10 ... 11 }).done(function(data) { 12 result = data.hoge; // (6) 13 }).fail(function() { 14 ... 15 }); 16 17 return result; // (4) 18}

投稿2014/12/08 15:45

ngyuki

総合スコア4514

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問