jQuery.Deferred在递归循环中

时间:2014-11-27 20:58:44

标签: javascript jquery asynchronous recursion jquery-deferred

我的代码中存在异常函数的复杂问题。 我有一个对象,我必须应用不同的功能(动画,内容分析等)。

this.buildChain = function (data, func, func_at, func_after) {

            //first I launch some function              
            func.apply(animData, arguments);

            //then I filter an array of objects             
            data.filter(function(e){
                if(e.trigger == 'at' && e.link == animData.id) return true; 
            }).forEach(function(e){

                //And apply the function to all objects that've been filtered
                //These  functions apply at the same time as the first, "func"                  
                func_at.apply(e, arguments);
            });

            //When my "func" and all "func_at" operations are resolved, I have
            //to filter my array again and execute "func_after" function
            data.filter(function(e){
                if(e.trigger == 'auto' && e.link == animData.id)  return true;
            }).forEach(function(e){
                func_after.apply(e, arguments);
            });

        };

事实是,我必须将此buildChain函数应用于递归函数:

function playChain(animData){

            function func() {
                //some action
            }

            function func_at () {
                playChain(this);
            }

            function func_after () {
                playChain(this);
            }

            s.buildChain(data, animData, func, func_at, func_after);
        }

我知道,它可以通过jQuery.Deffered()对象以某种方式解决,但是当涉及到递归循环时我会陷入困境。因为实际链可以从一个对象开始,然后会有func_at,然后一个func_after,然后再来一个func_at

1 个答案:

答案 0 :(得分:0)

我已将返回已解决的$.Deferred()对象添加到我的函数中。

function playChain(animData){

            function func() {
                //some action
                return new $.Deferred().resolve();
            }

            function func_at () {
                playChain(this);
            }

            function func_after () {
                playChain(this);
            }

            s.buildChain(data, animData, func, func_at, func_after);
        }

然后我更正了buildChain函数。

this.buildChain = function (data, animData, func, func_at, func_after) {

            function act1 () {

                var d = func.apply(animData, arguments);

                data.filter(function(e){
                    if(e.trigger == 'at' && e.link == animData.id) return true;
                }).forEach(function(e){
                    func_at.apply(e, arguments);
                });
                return d;
            }

            function act2() {
                data.filter(function(e){
                    if(e.trigger == 'auto' && e.link == animData.id)  return true;
                }).forEach(function(e){
                    func_after.apply(e, arguments);
                });
            }

            act1().done(act2);
        };