多个嵌套异步AJAX调用和返回数据的顺序

时间:2012-11-08 16:52:38

标签: ajax json asynchronous nested synchronous

这里的第一次海报。我已经找到了一些我遇到的其他问题的很好的答案,但是这个问题困扰了我,我不确定最好的方法。我做了一些搜索,但没有发现任何看起来像是一个解决方案。

我正在构建一个基本BOM显示表。该函数采用所需的部件ID和空格(仅用于缩进结果以便于阅读),并通过再次调用自身来检查任何子部件的每个结果,依此类推。

如果我将ASYNC设置为 false 并且我得到了预期的结果,那么这很有效但我认为可能有一种方法可以使这种异步并在更短的时间内获得相同的结果。 / p>

是的,我会修改它,因此不会在每次调用时更新DOM。我会将它改为变量,所以最后只有一个调用!

任何帮助表示赞赏。

/*******************************************************************
FUNCTION -  Traverse the BOM     
            Check each PID for child parts          
********************************************************************/   
function traverse_bom(search_term, spaces) {     
    spaces += "     ";
    $.ajax({
        //async: false, 
        url: 'spec_collector_ajax.php',
        dataType: 'json',
        data:  { data_retrieve: "database_query",
                 table: "Product_Structure",
                 order: "ORDER BY COMPRT_02",
                 search: search_term},                 
        success: function(data2) 
        {       
            // If there is data, then print it out to a table     
            if (data2 != 0) 
            {               
                // Iterate through each entry and list the results
                $.each(data2, function(i2,item2) 
                {      
                    // print the BOM entry info
                    $('#table_bom tbody:last').append( '<tr><td>' + spaces + item2.COMPRT_02 + '</td><td>' + item2.QTYPER_02 + '</td></tr>');

                    // Check for children under this part
                    traverse_bom(item2.COMPRT_02, spaces);                     
                });
            } 

            else
            {
            }
        },
        // Error handling
        error: function (xhr, ajaxOptions, thrownError) {
            // Print error message for debugging
            alert(thrownError);
        }
    }); 
};

1 个答案:

答案 0 :(得分:0)

您可以在递归呼叫期间设置async = false,使您的后续呼叫同步,并且不会搞砸您的订单。

例如:

/*******************************************************************
FUNCTION -  Traverse the BOM     
            Check each PID for child parts          
********************************************************************/   
function traverse_bom(search_term, spaces, synchronous) {
    //if synchronous is null default to asynchronous 
    if(synchronous == null) { synchronous = false; }

    spaces += "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
    $.ajax({
        //async: false, 
        url: 'spec_collector_ajax.php',
        dataType: 'json',
        async: !synchronous, //Not synchronous
        data:  { data_retrieve: "database_query",
                 table: "Product_Structure",
                 order: "ORDER BY COMPRT_02",
                 search: search_term},                 
        success: function(data2) 
        {       
            // If there is data, then print it out to a table     
            if (data2 != 0) 
            {               
                // Iterate through each entry and list the results
                $.each(data2, function(i2,item2) 
                {      
                    // print the BOM entry info
                    $('#table_bom tbody:last').append( '<tr><td>' + spaces + item2.COMPRT_02 + '</td><td>' + item2.QTYPER_02 + '</td></tr>');

                    // Check for children under this part
                    // This is where we set synchronous to true, inside the recursion.
                    traverse_bom(item2.COMPRT_02, spaces, true); 
                });
            } 

            else
            {
            }
        },
        // Error handling
        error: function (xhr, ajaxOptions, thrownError) {
            // Print error message for debugging
            alert(thrownError);
        }
    }); 
};