39279


標題の件を達成しようと、インターネット上の記事を参考に挑戦中ですが、自身の未熟さから理解に苦しみ中々進展をえることができません。毎度のことで大変申し訳ありませんが、どなたかご教示をお願いできませんでしょうか？

# 質問

Ajaxの動作完了を$.Deferred()というものの利用で認識できる記事をお見かしますが、Ajax利用の関数側がConsole.logで文字を表示するだけの紹介が多い気がします．．．  
Ajax利用でデータ取得した結果を当該関数の戻り値として返したいのですが、こちらの完了検知と併せて戻り値を取得するには如何したらよろしいのでしょうか？現況関数の呼び出し側に戻り値が得られていないように受けて取れます。（開発ツールでみる限りAjax自体は機能しており応答を返している様子だが）

# 達成したいことのイメージ

画面で指定された日付が、AJAXで参照するDB側のカレンダで稼働日か否か、はたまた参照に失敗したかというエラー検知を行おうとしています。

見よう見まねでコーディングしたのが現況です。誤った部分をご指摘頂けますと幸いです。

[code]

    //errnoが戻ってくれば、DBを参照できなかったか当該日が稼働日ではなかった、ということ。 
        var deferred = sdateCheck();
        if (deferred.done(function(){}) != "") {
            errhandler($(this), false, "err#014");
            errhandler($(this), false, "err#015");
        } else {
            errhandler($(this), true, errno);
        };
    
    
    function sdateCheck () {
            var deferred = new $.Deferred();
    
            var arr_ymd = $("#calendar").val().split("/");
            var yyyymmdd = arr_ymd[0] + arr_ymd[1] + arr_ymd[2];
            var errno = "";
            $.ajax({
                url: "sdatecheck.php",
                type: "POST",
                dataType: "json",
                data: {
                    maker_no: yyyymmdd,
                }
            })
            .done(function(data){
                //sdatecheck.phpからのSELECT結果１項目が戻る。「0」は稼働日
                if (data[0] != 0) {
                    errno = "err#014";
                }
            })
            .fail(function(){
                console.log("失敗");
                errno = "err#015";
            })
            .always(function(){           //みようみまね
                deferred.resolve();　　//みようみまね
            });                          //みようみまね
            return deferred;             //みようみまね
            return errno;                //勘
        }
    
[/code]


CC BY-SA 3.0
2017-11-03T06:37:37.977
39265
2017-11-03T21:47:57.117
2017-11-03T09:02:12.107
76
25696
question
javascript jquery
Ajax機能を有す関数からの戻り値を、動作完了後に参照・利用したい。


> 画面で指定された日付が、AJAXで参照するDB側のカレンダで稼働日か否か、はたまた参照に失敗したかというエラー検知を行おうとしています。

Deferredを使った、$.ajax接続判定例（”参照に失敗した”＝”接続エラー”として回答しました。）  
jQuery.Deferredの詳しい解説は、<https://techblog.yahoo.co.jp/programming/jquery-
deferred/> を見てください。  

[code]

    $(function(){
            var d = proc_a();
            d.done(function(data, textStatus){
                //ok
                console.log("ok:"+textStatus);
                console.log(data);
            });
            d.fail(function(data, textStatus){
                //error
                console.log("error:"+textStatus);
                console.log(data);
            });
    
        function proc_a(){
            var dp_a = new $.Deferred();
    
            $.ajax({
                    type: "GET",
                    url:  "test.php",
                    data: "hoge=piyo"
            }).done(function(data, textStatus, jqXHR){
                //done
                dp_a.resolve(data, textStatus, jqXHR);
    
            }).fail(function(data, textStatus, jqXHR){
                //fail
                dp_a.reject("error", textStatus, jqXHR);
    
            }).always(function(data, textStatus, jqXHR){
                //done、fail どちらでも処理を行うとき
            });
    
            return dp_a;
        }
    });
    
[/code]

また、DBに起因するエラーもfailとするなら以下の様にreject,resolveを呼び出すと良いでしょう。

[code]

    if (data[0] != 0) {
        errno = "err#014";
        dp_a.reject(errno, textStatus, jqXHR);//fail
    }else{
        dp_a.resolve(data, textStatus, jqXHR);//done
    }
    
[/code]

接続エラーの判定だけなら $.ajaxは内部でDeferred（Promiseを使っているかも）を使っているので以下の様にも書けます。

[code]

      $(function(){
            $.ajax({
                    type: "GET",
                    url:  "test.php",
                    data: "hoge=piyo"
                }).done(function(data, textStatus, jqXHR){
                    //ok
                console.log("ok:"+jqXHR.status);
                console.log(data);
                }).fail(function(data, textStatus, jqXHR){
                    //error
                console.log("error:"+jqXHR);
                });
       });
    
[/code]

以前の$.ajaxコールバック(jQuery1.7以降では非推奨 success:、error:）例です。

[code]

    $(function(){
            var d = proc_a();
            d.done(function(data, textStatus){
                //ok
                console.log("ok:"+textStatus);
                console.log(data);
            });
            d.fail(function(data, textStatus){
                //error
                console.log("error:"+textStatus);
                console.log(data);
            });
    
        function proc_a(){
            var dp_a = new $.Deferred();
    
            $.ajax({
                    type: "GET",
                    url:  "test.php",
                    data: "hoge=piyo",
                success:function(data, textStatus, jqXHR){
                    //done
                    dp_a.resolve(data, textStatus, jqXHR);
                },
                error:function(data, textStatus, jqXHR){
                    //fail
                    dp_a.reject("error", textStatus, jqXHR);
                }
            });
            return dp_a;
        }
    });
    
[/code]


CC BY-SA 3.0
2017-11-03T18:51:03.947
39279
2017-11-03T21:47:57.117
2017-11-03T21:47:57.117
22793
22793
39265
answer