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

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

ただいまの
回答率

89.12%

ajaxを操作する関数の戻り値がundefinedになってしまう。

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,052

前提・実現したいこと

現在、js/php.sqlを使用して、webアプリを作成しているものです。
初心者的な質問かもしれませんが、ajaxを操作する関数を作り、その関数の戻り値をほかで取得しようとするのですが、どうしてもundefinedになって取得できません。
どなたか取得方法をご教授ください。

該当のソースコード

下記の関数を作り、returnにphpから受けた戻り値をセットします。

function sample(samNo,samNo2) {
  var prm = {
    samNo:samNo,
    samNo2:samNo2};
    $.ajax({
    url: './api/sample.php',
       type: 'POST',
       cache: false,
       dataType: 'json',
       data: prm,
       async: false,
       success: function(o) {  //phpからの値を取得。
            if (o.status != 0) {
                alert(o.message);
                return false;
            }
    alert(o.data['hoge']); //呼び出し元でこのアラートは出ます。
            return o.data['hoge']; //これがどうしても渡せないです。
        },
        error: function(xhr, textStatus, errorThrown) {
            alert("ajax Error!!!\n" + textStatus + ' ' + errorThrown);
            return false;
        }
    })
}


この関数を実行

alert(sample(samNo,samNo2));  //undefinedになる(関数内のアラートは表示される)。

試したこと

asyncをfalseは試したのですが・・・。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m.ts10806

    2019/01/15 10:07

    詳細追記願います.
    > 呼び出し元でこのアラートは出ます。
    何がでますか?
    > この関数を実行
    samNo,samNo2に何が入っているのかこれではわかりません。

    >if (o.status != 0) {
    そもそもconsole.log(o); とした際にコンソールには何が出力されますか?

    キャンセル

回答 3

+1

async/awaitの出番だとは思いますが、下記記事にやり方が書いてあります。

【jQueryのajax()を利用すると返り値をとりたいときのやり方 - Qiita】
https://qiita.com/katsukii/items/bd64efcf4f070d77c028#その1同期通信にする

async: falseとすると、同期通信になる。 ただし同期通信の場合は時間がかかる処理をすると、その間UIがロックされてしまう。なのであまりやらない方がいい。

function test(){
    var result = $.ajax({
        type: 'GET',
        url: 'http://kitagawa.keiko',
        async: false
    }).responseText;
    return result;
}
var result = test() //ちゃんと返り値が入ってる;

【async function | MDN】
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/async_function

【async/await 入門(JavaScript) - Qiita】
https://qiita.com/soarflat/items/1a9613e023200bbebcb3

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/15 08:11

    回答ありがとうございます。
    試してみます。

    キャンセル

  • 2019/01/15 08:21

    async/waitの構文を読んでみたのですが、わたくし、初心者レベルでいまいち意味が分かりません。
    私が書きたい上記のプログラムであれば、どのように記述したらよろしいのでしょうか???

    キャンセル

  • 2019/01/15 08:21

    async/falseは試しました。

    キャンセル

  • 2019/01/15 09:40

    質問者さん
    細かいですが「async/await 」ですね(waitではありません)
    ajaxのasyncオプションは通信を同期か非同期かを決める設定なのでasync/awaitとはまた別の概念です。

    キャンセル

checkベストアンサー

0

基本を誤解していると思います

$.ajaxのsuccessやdoneのコールバックでreturnが返すのは
$.ajax自体でありその親のfunctionは関係ない
そして$.ajaxが返すのはjQueryのajaxオブジェクト
つまりこういう参照になります

  • test.html
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script>
$(function(){
  var hoge=test(10,20);
  console.log(hoge);
  hoge["datas"].done(function(data){
    console.log(data);
  });
});
function test(arg1,arg2){
  return {
  samNo:arg1,
  samNo2:arg2,
  datas:$.ajax({
  url:"test.json",
  dataType:"json",
  }).done(function(data){
    return data;
  })};
}
</script>
  • test.json
{"a":1,"b":2}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/15 21:44

    皆様ご親切にありがとうございます。
    私の職場の詳しい者に確認を取った結果、php側で処理することにより、
    私のしたいことが実現いたしました。
    問題提起も、解決の結果も中途半端になり、大変申し訳ありませんでした。

    キャンセル

0

function sample(samNo,samNo2) {
  var prm = {
    samNo:samNo,
    samNo2:samNo2
  };
  // 返り値を一時的に保存
  var ajax = $.ajax({
    url: './api/sample.php',
    type: 'POST',
    cache: false,
    dataType: 'json',
    data: prm,
    async: false,
    success: function(o) {
      if (o.status != 0) {
        alert(o.message);
        return false;
      }
      alert(o.data['hoge']);
      return o.data['hoge'];
    },
    error: function(xhr, textStatus, errorThrown) {
      alert("ajax Error!!!\n" + textStatus + ' ' + errorThrown);
      return false;
    }
  });
  // 関数の返り値としてもreturn
  return ajax;
}

このようにすれば、動作すると思います。

この方法では動作しません。
以下のようにする必要があります。

function sample(samNo,samNo2) {
  var prm = {
    samNo:samNo,
    samNo2:samNo2
  };
  var ajax = $.ajax({
    url: './api/sample.php',
    type: 'POST',
    cache: false,
    dataType: 'json',
    data: prm,
    async: false
  });
  return ajax;
}
function success(o) {
  if (o.status != 0) {
    alert(o.message);
    return false;
  }
  alert(o.data['hoge']);
  return o.data['hoge'];
}

var sample = sample(1, 2);
success(sample.responseJSON);

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/15 00:19

    修正ありがとうございます。
    被疑箇所を改め、回答を修正しました。

    キャンセル

  • 2019/01/15 07:59

    回答ありがとうございます。
    一時的にajaxという名の変数に格納し、
    ajaxを返してみたのですが、動きません。

    キャンセル

  • 2019/01/15 20:47 編集

    他の方が回答されている通り、自分の回答は間違っていました。
    誤解を招く恐れがありますので、回答は修正しておきます。

    キャンセル

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

  • ただいまの回答率 89.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる