【问题标题】:Calling ajax inside ajax在ajax内部调用ajax
【发布时间】:2012-08-23 20:36:45
【问题描述】:

这是我在这里的第一天也是第一个问题,如果我的问题对于这个平台来说非常琐碎,希望你能原谅我。

我正在尝试在 ajax 中调用 ajax,一个 ajax 调用将调用一个 cotroller 操作,它将在数据库中插入一条记录,第一个 ajax 调用的操作是

public function createAction(Request $request){
    if ($request->isXmlHttpRequest()) {
        $name = $request->get("gname");
        $description = $request->get("desc");
                    $portfolio_id = $request->get("PID");
                    $portfolio = $this->getDoctrine()
                        ->getRepository('MunichInnovationGroupPatentBundle:PmPortfolios')
                        ->find($portfolio_id);
        $portfolio_group = new PmPatentgroups();
        $portfolio_group->setName($name);
        $portfolio_group->setDescription($description);
        $portfolio_group->setPortfolio($portfolio);
        $portfolio_group->setOrder(1000000);
        $portfolio_group->setIs_deleted(0);
        $em = $this->getDoctrine()->getEntityManager();
        $em->persist($portfolio_group);
        $em->flush();
        $msg = 'true';
    }
    echo $msg;
    return new Response();
}

第二个ajax调用将获取第一个ajax调用插入的更新数据,这个调用的动作是

public function getgroupsAction(Request $request){
    if ($request->isXmlHttpRequest()) {

        $id = $request->get("PID");
        $em = $this->getDoctrine()->getEntityManager();
        $portfolio_groups = $em->getRepository('MunichInnovationGroupPatentBundle:PmPatentgroups')
        ->getpatentgroups($id);
        echo json_encode($portfolio_groups);
        return new Response();
    }
}

我的JQuery如下

 $.ajax({
         type: 'POST',
         url: url,
         data: data,
         success: function(data) {
         if(data == "true") {
                 $("#new-group").fadeOut("fast", function(){
                 $(this).before("<strong>Success! Your Portfolio Group is created Successfully.</strong>");
                 setTimeout("$.fancybox.close()", 3000);
                 });
                  $.ajax({
                          type: 'POST',
                          url: getgroups,
                          data: data,
                          success: function(data) 
                          { 
                            var myArray = JSON.parse(data); 
                            var options = $("#portfolio-groups"); 
                            for(var i = 0; i < myArray.length; i++)
                            { 
                              options.append($("<option />").val(myArray[i].id).text(myArray[i].name)); 
                             } 
                       } 
                });
            }
         }
     });

我在第一个成功内调用第二个ajax,以确保第一个ajax成功完成,但是第二个ajax调用没有得到更新的数据。

如何确保在第一个 ajax 完成后调用第二个 ajax 并且我也得到最近插入的数据

谢谢

我的解决方案 只需使用一个 ajax 调用

在进行插入的创建操作中,在插入之后获取投资组合的所有组,并返回 json_encode($portfolio_groups);

JQuery 内部

 $.ajax({
        type: 'POST',
        url: url,
        data: data,
        success: function(data) {
              $("#new-group").fadeOut("fast", function(){
              $(this).before("<strong>Success! Your Portfolio Group is created Successfully.</strong>");
              setTimeout("$.fancybox.close()", 3000);
              });
              var myArray = JSON.parse(data); 
              var options = $("#portfolio-groups"); 
              for(var i = 0; i < myArray.length; i++)
              { 
                 options.append($("<option />").val(myArray[i].id).text(myArray[i].name)); 
               } 
            }
       });   

【问题讨论】:

  • 为什么不在第一个 ajax 调用中返回你需要的数据呢?这样您就不必再打第二个电话了
  • @Carlos Granados 好主意让我试试

标签: php ajax jquery symfony


【解决方案1】:

我认为问题可能在于您有很多变量名称“数据”。在第二个 ajax 调用中,发送的数据将始终为“真”,但我怀疑您想发送其他内容。我会给他们独特的名字,让事情更清楚,看看会发生什么。

【讨论】:

  • 数据变量是相同的,因为在两个调用中需要发送的数据相同,但是两个调用的url不同
  • 是的,但是您还使用“数据”作为 ajax 调用返回的数据的名称,这会搞砸
  • function(data) 可以是'returnedData'而且不一样!
【解决方案2】:

只使用一个 ajax 调用

在进行插入的创建操作中,在插入后获取投资组合的所有组,并返回 json_encode($portfolio_groups);

JQuery 内部

$.ajax({
    type: 'POST',
    url: url,
    data: data,
    success: function(data) {
          $("#new-group").fadeOut("fast", function(){
          $(this).before("<strong>Success! Your Portfolio Group is created Successfully.</strong>");
          setTimeout("$.fancybox.close()", 3000);
          });
          var myArray = JSON.parse(data); 
          var options = $("#portfolio-groups"); 
          for(var i = 0; i < myArray.length; i++)
          { 
             options.append($("<option />").val(myArray[i].id).text(myArray[i].name)); 
           } 
        }
   });  

【讨论】:

    【解决方案3】:

    Ajax 在第一个 Ajax 的成功方法中,正如您所做的那样,应该确保您在第一个 Ajax 之后调用第二个 Ajax。只有在返回结果后才会触发成功方法。
    对于测试,在调用第二个之前,在第一个 Ajax req 中添加 console.log()。以及第二个 Ajax 成功方法中的另一个 console.log()。

    尝试将 console.log 放在第一个 success->data 变量上,看看你得到了什么。如果你有错误我会导致第二个请求失败。

    【讨论】:

    • 我可以在控制台看到它们都执行成功了
    • 它们是否按照您预期的顺序出现?你能写出两者的输出是什么吗?
    • 是的,它们如我所愿,实际上第一个 ajax 调用只是在组表中插入一个组,第二个获取所有组的更新结果并将它们填充到一个选择框中,所以在 createAction 中插入组后,我运行查询以获取所选投资组合的所有组,然后将其作为 JSON 返回,在我的 JQuery 中,您可以看到我如何解析 JSON 字符串并使用更新的数据填充我的 Select 下拉列表,并且对于您的信息该组是使用fancybox 弹出表单创建的