如何同步两个嵌套的jqueryforeach循环?

如何同步两个嵌套的jqueryforeach循环?,jquery,ajax,Jquery,Ajax,在内部循环的最后一次迭代中,我想调用一个包含ajax调用的jquery函数,每个循环有两个嵌套。只有在从这个ajax调用中获得结果之后,才应该进行下一次外部for each的迭代。有没有办法同步这些循环 $.ajax({ type: "POST", contentType: 'application/json;charset=utf-8', dataType:'json', url: 'getCall1', data

在内部循环的最后一次迭代中,我想调用一个包含ajax调用的jquery函数,每个循环有两个嵌套。只有在从这个ajax调用中获得结果之后,才应该进行下一次外部for each的迭代。有没有办法同步这些循环

$.ajax({
        type: "POST",
        contentType: 'application/json;charset=utf-8',
        dataType:'json',
        url: 'getCall1',
        data: JSON.stringify(send_data),
        success: function(json)
        {
          $.each(json,function(i,item){
            $.ajax({
                    type: "POST",
                    contentType: 'application/json;charset=utf-8',
                    dataType:'json',
                    url: 'getcall2',
                    data: JSON.stringify(send_data),
                    success: function(json)
                    {
                      $.each(json,function(i,item){
                       //For last iteration of this loop i want to call a function contain another ajax call. After completion of this call i want to continue with next iteration of outer loop
                        callFun();
                      });
                    }
             });
      });
   }

});

function callFun(){
  $.ajax({
        type: "POST",
        contentType: 'application/json;charset=utf-8',
        dataType:'json',
        url: 'getcall3',
        data: JSON.stringify(send_data),
        success: function(json)
        {

        }
  });
}

您可以使用jQuery承诺或延迟对象,这将最适合您的问题。确保所有这些Ajax都是异步的。请像这样尝试:

     var promiseOne, promiseTwo,promiseThree;
        // Promises
        promiseOne = $.ajax({ url: 'getCall1' });

        promiseTwo = $.ajax({ url: 'getcall2' });

        promiseThree=$.ajax({ url: 'getcall3' });

     $.when(promiseOne).done(function(jsonValue1){
       $.each(jsonValue1,function(value1){
          $.when(promiseTwo).done(function(jsonValue2){
            $.each(jsonValue2,function(value2){
              $.when(promiseThree).done(function(jsonValue3){
               $.each(jsonValue3,function(value3){

                //write the code here

           })
            })
          })
        })
      })

 });

您可以使用回调函数处理它:

$.ajax({
    type: "POST",
    contentType: "application/json;charset=utf-8",
    dataType: "json",
    url: "getCall1",
    data: JSON.stringify(send_data),
    success: function(json)
    {
        var keys = Object.keys(json);
        if(keys.length)
        {
            func1(0, keys, json);
        }
    }

});

function func1(index, keys, json1)
{
    //you can get values from json1 using:
    var val = json1[keys[index]];
    //and use val
    $.ajax({
        type: "POST",
        contentType: "application/json;charset=utf-8",
        dataType: "json",
        url: "getcall2",
        data: JSON.stringify(send_data),
        success: function(json2)
        {
            var keys2 = Object.keys(json2),
                i;
            if(keys2.length)
            {
                for(i = 0; i < keys2.length; i++)
                {
                    //do as you wish
                    if(i === (keys2.length - 1))
                    {
                        callFun(
                            function callBack()
                            {
                                if(index < keys.length)
                                {
                                    func1(++index, keys, json1);
                                }
                            }
                        );
                    }
                }
            }
        }
    });
}

function callFun(callbackFunc)
{
    $.ajax({
        type: "POST",
        contentType: "application/json;charset=utf-8",
        dataType: "json",
        url: "getcall3",
        data: JSON.stringify(send_data),
        success: function(json)
        {
            callbackFunc();
        }
    });
}
$.ajax({
类型:“POST”,
contentType:“应用程序/json;字符集=utf-8”,
数据类型:“json”,
url:“getCall1”,
数据:JSON.stringify(发送数据),
成功:函数(json)
{
var keys=Object.keys(json);
if(键长度)
{
func1(0,键,json);
}
}
});
函数func1(索引、键、json1)
{
//您可以使用以下方法从json1获取值:
var val=json1[键[索引];
//并使用val
$.ajax({
类型:“POST”,
contentType:“应用程序/json;字符集=utf-8”,
数据类型:“json”,
url:“getcall2”,
数据:JSON.stringify(发送数据),
成功:函数(json2)
{
var keys2=Object.keys(json2),
我
if(键2.长度)
{
对于(i=0;i

祝你好运

你应该了解它将如何影响你的表现。几个嵌套的AJAX调用需要花费很多时间来执行。我可以很快得到结果,但问题是两个循环没有等待函数调用“callFun”,我认为人们忽略了隐含的问题,您只在代码注释中指定了:
对于这个循环的最后一次迭代,我想调用一个包含另一个ajax调用的函数。完成此调用后,我想继续外循环的下一次迭代
我想通过getcall2和getcall3传递两个json值,我应该在哪里指定。您不需要所有这些嵌套,正如指定的那样,
when
可以接受多个承诺,并在完成所有承诺后解析。您还错过了问题的要点:
对于这个循环的最后一次迭代,我想调用一个包含另一个ajax调用的函数。在完成这个调用之后,我想在ajax Async中继续下一次外循环迭代。调用时,您必须等待完成调用并获取数据并使用它,否则您将得到“未定义”。