関数内で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ページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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
総合スコア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
総合スコア988
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
参考情報を紹介します。 (google で "ajax jquery return" を検索した結果からの抜粋)
- jQueryのajax()で返り値を得る方法 http://tkmr.hatenablog.com/entry/2014/08/08/084755
...
これはajax()がデフォルトでは非同期通信をするためである。非同期通信とは、レスポンスが返って来る前に次の処理に行くことである。だから返り値を返す前に次の処理に行っちゃう。
...
解決策
- 同期通信にしちゃう
...
2. .done(), .fail()をつかう
...
投稿2014/12/07 17:39
総合スコア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
総合スコア988
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
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
総合スコア4514
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。