第一个Ajax调用的返回值未在第二个ajax调用中显示

时间:2009-08-13 06:54:53

标签: jquery ajax cakephp

我是JQuery和Ajax的新手

我正在尝试使用从Ajax调用返回的值到另一个Ajax调用。 例如:

$.ajax({
    type: "POST",
    url: "http://localhost/FormBuilder/index.php/forms/saveForm/",
    async: false,
    data: "formname="+formname+"&status="+status,
    success: function(msg){
        //alert( "Data Saved: " + msg);                         
        getformid=msg; 
    }//success
});//ajax 

$("#fb_contentarea_col1down21 div").each(function() { 
    alert("Form id "+getformid);//alerts me the Formid returned from the Cakephp controller side
    var checked="false";
    var id=$(this).attr("id");
    var fsize=$("#input"+id+"").width();
    var ftype=$("#input"+id+"").attr('data-attr');
    var finstr=$("#instr"+id+"").text();
    var fname=$("#label"+id+"").clone().html().replace(/<span.*/,'');
    if($("#label"+id+"> span.req").length > 0)
    {
        checked="true";
    }

    $.ajax({
        type: "POST",  
        async: false,
        url: "http://localhost/FormBuilder/index.php/forms/saveField",
        data: "sequence_no="+id+"&name="+fname+"&type="+ftype+"&size="+fsize+"&instr="+finstr+"&formid="+getformid+"&required="+checked,
        success: function(msg){
               //alert( "Data Saved: " + msg);
        }//success
    });//ajax
});//DIV    

第一个Ajax调用返回表单ID,甚至在div中正确提醒它,但getformid中返回的值不会反映在第二个ajax调用中。请告诉我出了什么问题。

编辑:解决了错误。我的Cakephp控制器中的原因不在于我的Ajax调用,我只返回表单ID而不是表单实例。我已经改变并得到了答案。感谢所有帮助过的人。

1 个答案:

答案 0 :(得分:2)

编辑:我刚刚意识到您正在进行同步(非A)jax查询?

我说这是因为你正在使用

async: false,
在你的两个Ajax请求中

这意味着只要每个请求完成,您的用户的浏览器就会冻结;你真的应该三思而后行:如果你的服务器真的不是很快,你的用户会认为“这个网站是废话,它是免费的,我的浏览器

请参阅http://docs.jquery.com/Ajax/jQuery.ajax#options

  

默认情况下,发送所有请求   异步(即设置为true)   默认情况下)。如果你需要同步   请求,将此选项设置为false。   请注意,同步请求可能   暂时锁定浏览器,   禁用任何操作时   请求已激活。


这仅适用于执行异步请求:
因此,现在可能不是问题;但如果你将请求更改为异步,它将变得相关,所以我不会删除它。

首先,Ajax意味着 A 同步:Ajax请求在后台完成,而页面/脚本的其余部分继续执行。

这意味着:

  • 启动第一个Ajax请求
  • 它是在后台完成的
  • 当它在后台完成时(因为执行几行JS代码比向服务器发出请求要快得多),JS代码继续执行
    • 当您启动第二个Ajax查询时,第一个Ajax查询可能尚未完成。

可能发生的情况是,你的情况是,只有在第一个Ajax查询完成时才设置getformid - 这是在第二个Ajax查询已经开始之后。

如果您希望仅在第一个Ajax查询完成时启动第二个Ajax查询,则第二个Ajax查询必须由挂在第一个的“success”事件上的函数启动(而不是分配“ msg“to”getformid“):将它”放在源头后“是不够的。