3

初ポスターはこちら。私が遭遇した他の問題に対するいくつかの素晴らしい答えを見つけましたが、これは私を困惑させ、最善の方法がわかりません. 私はいくつかの検索を行いましたが、解決策と思われるものは何も見つかりませんでした。

基本的な BOM 表示であるテーブルを作成しています。この関数は、目的のパーツ ID とスペース (読みやすくするために結果をインデントするために使用されます) を受け取り、それ自体を再度呼び出して子パーツの各結果をチェックします。

これは、ASYNC をfalseに設定して目的の結果が得られた場合にうまく機能しますが、これを非同期にして同じ結果をより短時間で達成する方法があるのではないかと考えました。

はい、私はそれを変更して、各呼び出しで DOM を更新しないようにします。これを変数に変更して、最終的に呼び出しが 1 つだけになるようにします。

どんな助けでも感謝します。

/*******************************************************************
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 に答える