0

$.deferred オブジェクトを使用して、再帰関数の要求を処理したいと考えています。

しかし、ここで問題があります

  • $.whenは call1 の成功を待たずに call2 を実行します!

  • call1 から返されたデータを call2 関数に送信しません!

注: async:true; を使用して ajax を実装したいだけです。

前もって感謝します!

m.mov

    //*********************************************************************

    var i = 3; // just run the queue 3 times 

    function getNode(node_object_array)
    {
        $.when(call1(node_object_array)).then(call2);

        i--;
        if(i >= 0)
            getNode(next_level_childs);

    }

function call1(node_object_array)
    {
            var root_array = new Array();
        var d = new $.Deferred();

        $.each(node_object_array , function(index , each_root_node) {

            console.log("making request  for"+each_root_node.node_guid );
                 $.ajax({
                    url: url ,
                    dataType: 'json',
                    success: function(json) {
                        root_array.push(getNodeData(json));
                        console.log("success request for"+each_root_node.node_guid );
                    },
                });
        });

        d.resolve(root_array);
        return d;
    }



    //****** call2 which receive data from call1 and call some $.ajax's ****
    function call2(data)
    {
            var next_level_childs = new Array();
        var d = new $.Deferred();

        $.each(data , function(index , each_root_node) {
            $.each(each_root_node.childs , function(index , each_root_node_child) {
                console.log("making request for "+each_root_node_child );
                    $.ajax({
                        url: url ,
                        dataType: 'json',
                        async : false,
                        success: function(json) {
                            console.log("success request for"+each_root_node_child );
                            next_level_childs.push(getNodeData(json));
                        }
                    });
            });
        });
        d.resolve(next_level_childs);
        return d;
    }
4

1 に答える 1

0

ajax 呼び出しが完了する前に Deferred を解決すると、$.when は終了したと見なし、次の関数 (call2) を呼び出します。あなたがする必要があるのは、call1 内の ajax 呼び出しの成功/失敗で解決することです。

編集:実際には、ajax 呼び出しからのすべての約束を組み合わせる必要があるため、すべての約束が完了した後にのみ遅延を解決します。$.each 呼び出しに気づいただけです。

于 2013-08-26T08:11:06.930 に答える