使用jquery进行顺序ajax查询

时间:2014-12-08 10:21:07

标签: javascript jquery ajax

我花了很长时间试图通过各种代码迭代来解决这个问题,但没有运气。来自php背景我是javascript的新手。

假设有三个补丁的数组:patch1,patch2,patch3。 我想要实现的是:

  1. 每个补丁的ajax调用相同的php脚本,但每次调用必须在上一次调用完成后进行
  2. 完成所有3个完成后,将对单独的php脚本进行ajax调用。
  3. 第2点工作正常,第1点不是这样。

    下面是我的代码:同时为所有3个补丁调用myAjaxInitialData函数(和底层的php脚本),而不是等待每个补丁完成。正确地说,myAjaxGetSRCount没有被称为unitl所有补丁都已完成。

    <body onload="initialData(0)">
    
    <script>
    function initialData(i) {
    
        var patches = [<?php echo $jsPatchArray ?>];
        var x = patches.length - 1;
    
        var divId = "#initialData-patch-" +i;
        var script = "ajax_initial_data.php";
        var dataVar = "patch";
        var data = patches[i];
    
        if ( i != x) {
            i++;
            $.when(myAjaxInitialData(divId,script,dataVar,data)).then(initialData(i));
        } else {
            $.when(myAjaxInitialData(divId,script,dataVar,data)).then(myAjaxGetSRCount);
        }   
    }
    
    
    function myAjaxInitialData(divId,script,dataVar,data ) {
    
        return $.ajax({ 
            type: "GET",
            url: script,
            data: {patch:data},
            success: function( response ) {     
                $( divId ).html( response );
            }
        }); 
    }
    
    function myAjaxGetSRCount() {
    
        document.getElementById('srCount').innerHTML="Retrieving SR Counts..";
    
        $.ajax({ 
            type: "GET",
            url: "ajax_sr_count.php",
            success: function( response ) {
                $( "#srCount" ).html( response ); 
            }
        });
    }
    </script>
    

1 个答案:

答案 0 :(得分:1)

你的问题似乎在这里:

$.when(myAjaxInitialData(divId,script,dataVar,data)).then(initialData(i));

then接受回调,即一个函数。 initialData(i)不返回任何内容,因此您将undefined传递给此函数。如果你想在这个ajax请求之后调用initialData,那么你需要将它包装在一个无参数函数中。

$.when(myAjaxInitialData(divId,script,dataVar,data)).then(function() { initialData(i); });

您还应该非常清楚i的值将是回调时的值。关闭迭代器变量时,应该在创建回调之前捕获所需的值。即。

if (i != x) {
    i++;
    var j = i;
    $.when(myAjaxInitialData(divId,script,dataVar,data)).then(function() { initialData(j); });
}