3

第一次在这里发海报。对于我遇到的其他问题,我找到了一些很好的答案,但是这个问题让我很难过,我不确定最好的解决方法。我进行了一些搜索,但没有找到任何看起来像是解决方案的东西。

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

如果我将 ASYNC 设置为false并且我得到了想要的结果,这会很好,但我认为可能有一种方法可以使这个异步并在更短的时间内达到相同的结果。

是的,我将对其进行修改,使其不会在每次调用时更新 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);
        }
    }); 
};
4

1 回答 1

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);
        }
    }); 
};
于 2013-02-07T01:13:00.970 回答