如何在javascript中将AJAX函数内的值返回给parent?

时间:2012-03-13 23:27:15

标签: javascript jquery ajax

我正在尝试将函数返回true或false,具体取决于其中的AJAX函数的响应,但我不知道该怎么做。

(function($) {
    $('#example').ajaxForm({
        beforeSubmit : function(arr, $form, options) {

            var jsonStuff = JSON.stringify({ stuff: 'test' });

            $.post('/echo/json/', { json: jsonStuff }, function(resp) {

                if (resp.stuff !== $('#test').val()) {
                     // Cancel form submittion
                     alert('Need to type "test"');
                     return false; // This doesn't work          
                }

            }, 'json');

        },
        success : function() {
             alert('Form sent!');   
        }
    });   
})(jQuery);​

我做了一个小提琴来更好地说明这一点:

http://jsfiddle.net/vengiss/3W5qe/

我正在使用jQuery和Malsup的Ajax Form插件,但我相信这种行为与插件无关,我只需要return false beforeSubmit函数,具体取决于POST请求,以便每次都不提交表单。有人能指出我正确的方向吗?

提前致谢!

2 个答案:

答案 0 :(得分:6)

处理异步函数时无法做到这一点。调用post的函数将立即返回,而ajax回调将在将来的某个时刻返回。现在无法返回未来的结果。

相反,您需要做的是将回调传递给原始函数。最终将使用ajax调用的结果调用此函数

var makePostCall = function(callback) {
  $.post('/echo/json/', { json: jsonStuff }, function(resp) {
    if (resp.stuff !== $('#test').val()) { 
      // Cancel form submittion
      alert('Need to type "test"');
      callback(false);
    } else { 
      callback(true);
    }}, 'json');
};

然后将期望从makePostCall得到快速响应的代码切换为使用回调。

// Synchronous version 
if (makePostCall()) { 
  // True code 
} else {
  // false code
}

// Async version
makePostCall(function (result) {
  if (result) {
    // True code
  } else {
    // False code
  }
});

答案 1 :(得分:0)

您可以将async:false参数放入ajax请求,然后您可以控制将来的响应并将结果发送回父级。见***中包含的以下主线        add:function(e,data){

    //before upload file check server has that file already uploaded
      ***var flag=false;***
      $.ajax(
            {
                type: "POST",
                dataType:'json',
                url:"xyz.jsp",
                ***async:false,***
                data:{  
                         filename : upload_filename,
                         docname : upload_docname,
                         userid : upload_userid,
                    },
                success:function(data)
                {
                    ***flag=true;***
                },
                error:function(request,errorType,errorMessage) 
                {
                    alert ('error - '+errorType+'with message - '+errorMessage);
                }
        });

       ***return flag;***

        }