2

重複の可能性:
jQuery:ajax呼び出しが成功した後にデータを
返すjQuery AJAX:成功時に値を返す

なぜgoodPasswordいつも戻ってくるのかundefined わからない」それはただのばかげた間違いであり、あなたの答えに感謝するだろうと確信している

function foo(){
    var goodPassword;
    jQuery.ajax({
        data: "action=Potato",
        url: 'servletPotato',
        timeout: 2000,
        error: function() {
            console.log("Failed to send ajax");
        },
        success: function(r) {
            var data = jQuery.parseJSON(r);
            if(data.aprovePassword == "true")
            {
                goodPassword = true;
            }
            else
            {
                goodPassword = false;
            }
        }
    });
    return goodPassword;
}

ajax呼び出しは確実に機能し、data.aprovePasswordは確実にサーブレットから「false」として返されます

4

3 に答える 3

2

まだ何も割り当てられていないためgoodPassword、関数の終了後にXHRリクエストが実行されるため、関数の終了までに何も割り当てられていません。代替機能は次のとおりです。

function foo(successCallback) {
    var goodPassword;
     jQuery.ajax({
         data: "action=Potato",
         url: 'servletPotato',
         timeout: 2000,
         error: function() {
            console.log("Failed to send ajax");
         },
         success: function(r) {
            var data = jQuery.parseJSON(r);
            if(data.aprovePassword == "true")
                {
                    goodPassword = true;
                }
            else
                {
                    goodPassword = false;
                }
            successCallback(goodPassword);
       }});
  }
于 2012-08-18T14:13:07.933 に答える
1

問題は、ajaxリクエストが非同期であるため、jQuery.ajax呼び出しを開始した直後に関数が返され、その時点でgoodPasswordがまだ定義されていないことです。

代わりに、次のようなことを行う必要があります。

function foo(callback) {
    var goodPassword;

    jQuery.ajax({
     data: "action=Potato",
     url: 'servletPotato',
     timeout: 2000,
     error: function() {
        console.log("Failed to send ajax");
     },
     success: function(r) {
        var data = jQuery.parseJSON(r);

        if(data.aprovePassword == "true") {
                goodPassword = true;
        } else {
                goodPassword = false;
        }

        callback(goodPassword);
   }});
}

次に、次のように関数を呼び出します。

foo(function(goodPassword) {
    console.log('goodPassword is ' + goodPassword);
});
于 2012-08-18T14:17:17.360 に答える
0

関数が戻った後にajax呼び出しが発生するため、戻り値を確認することはできません。

成功時と失敗時の2つのアクションを実行するには、次のことを行う必要があります。

var foo = function(goodCallback, badCallback){
  jQuery.ajax({
    data: "action=Potato",
    url: 'servletPotato',
    timeout: 2000,
    error: function() {
      console.log("Failed to send ajax");
    },
    success: function(r) {
      var data = jQuery.parseJSON(r);
      if(data.aprovePassword == "true")
      {
        goodCallback();
      }
      else
      {
        badCallback();
      }
    }
  });
};

foo(
  function() {
    console.log('dude good password');
  },
  function() {
    console.log('bad password');
  }
);

またはコールバック関数を1つだけ持つと、goodpasswordのブール値を取得します。

于 2012-08-18T14:20:26.723 に答える